Validate only 1 and 2 in an sql table in the relational and logical model?

0

Good morning, how do I validate values using relational and logical relationships, where the employee can only enter values below?

1: Disponível 
2: Emprestado 
    
asked by anonymous 05.06.2018 / 13:09

2 answers

1

You can use a foreign key for a domain table containing all valid and / or acceptable values.

Imagine a hypothetical scenario where you want to control borrowing books. In this scenario, a Livro can only be Disponível or Emprestado .

The model would look something like:

TranslatingtoPg/SQL:

--POSSIVEISSTATUSDEUMLIVROCREATETABLEtb_status(idBIGINTPRIMARYKEY,descricaoTEXT);--LIVROSCREATETABLEtb_livro(idBIGINTPRIMARYKEY,id_statusBIGINT,tituloTEXT,autorTEXT,FOREIGNKEY(id_status)REFERENCEStb_status(id));

ListingthepossibleStatusofaLivro:

INSERTINTOtb_status(id,descricao)VALUES(1,'Disponível');INSERTINTOtb_status(id,descricao)VALUES(2,'Emprestado');

RegisteringLivroswithStatusofDisponível:

INSERTINTOtb_livro(id,id_status,titulo,autor)VALUES(100,1,'MemóriasPóstumasdeBrásCubas','MachadodeAssis');INSERTINTOtb_livro(id,id_status,titulo,autor)VALUES(200,1,'Macunaíma','MáriodeAndrade');

RegisteringLivroswithStatusofEmprestado:

INSERTINTOtb_livro(id,id_status,titulo,autor)VALUES(300,2,'VidasSecas','GracilianoRamos');INSERTINTOtb_livro(id,id_status,titulo,autor)VALUES(400,2,'FogoMorto','JoséLinsdoRego');INSERTINTOtb_livro(id,id_status,titulo,autor)VALUES(500,2,'GrandeSertão:Veredas','GuimarãesRosa');

Returningbooks:

--DEVOLUCAODOLIVRO:"GRANDE SERTAO VEREDAS"
UPDATE tb_livro SET id_status = 1 WHERE id = 500;

-- DEVOLUCAO DO LIVRO: "VIDAS SECAS"
UPDATE tb_livro SET id_status = 1 WHERE id = 300;

Livros loan:

-- EMPRESTIMO DO LIVRO: "MACUNAIMA"
UPDATE tb_livro SET id_status = 2 WHERE id = 200;

-- EMPRESTIMO DO LIVRO: "MEMORIAS POSTUMAS"
UPDATE tb_livro SET id_status = 2 WHERE id = 100;
Attempting to change Status from Livro to something invalid would cause foreign key violation, not allowing Status invalid Livro :

UPDATE tb_livro SET id_status = 3 WHERE id = 100;

Output:

ERROR: insert or update on table "tb_livro" violates foreign key constraint "tb_livro_id_status_fkey" Detail: Key (id_status)=(3) is not present in table "tb_status".

SQLFiddle: link

    
05.06.2018 / 20:36
0

You can add a constraint to check the field values, like this:

ALTER TABLE nome-da-tabela
   ADD CONSTRAINT check-valores
   CHECK (nome-do-campo= 1 OR nome-do-campo = 2);

Or when creating a table:

CREATE TABLE nome-da-tabela(
    nome-do-campo integer CHECK (nome-do-campo= 1 OR nome-do-campo = 2)
);
    
05.06.2018 / 13:38