nt-family: Arial">
Clique aqui para ler todos os artigos desta edição
Tutorial SQL: Constraints
Constraints (restrições) mantém os dados do usuário restritos, e assim evitam que dados inválidos sejam inseridos no banco. A mera definição do tipo de dado para uma coluna é por si só um constraint. Por exemplo, uma coluna de tipo DATE restringe o conteúdo da mesma para datas válidas.
Este artigo aborda uma variedade de constraints. Para isso, utilizaremos como SGBD para exemplificar a definição e uso de constraints o PostgreSQL (para saber mais sobre este SGBD, visite o site oficial do projeto em http://www.postgresql.org e o site oficial do projeto no Brasil em http://www.postgresql.org.br).
NOT NULL
A constraint NOT NULL impede que valores nulos sejam inseridos em uma coluna. A Listagem 1 mostra a criação de uma tabela com uma constraint NOT NULL.
A inserção de um valor NULL, ou um INSERT que fosse colocar NULL em col2, causaria uma falha do INSERT.
Como mostrado na Listagem 1, o UPDATE de um valor NULL também falha.
Na Listagem 2, adiciona-se um valor DEFAULT para col2. Esta adição permite que os INSERTs não especifiquem um valor para col2, pois caso não seja especificado um valor para col2, será considerado o valor DEFAULT na inserção.
UNIQUE
A constraint UNIQUE impede que valores duplicados sejam inseridos na coluna. É implementada criando-se um índice unívoco em uma coluna. Como mostrado na Listagem 3, o UNIQUE impede valores duplicados na coluna.
O CREATE TABLE exibe um nome de um índice unívoco criado. A Listagem 3 também mostra que valores nulos múltiplos podem ser inseridos em uma coluna UNIQUE.
Listagem 1. Criação de tabela com constraint NOT NULL em coluna.
test=> CREATE TABLE not_null_test (
test(> col1 INTEGER,
test(> col2 INTEGER NOT NULL
test(> );
CREATE
test=> INSERT INTO not_null_test
test-> VALUES (1, NULL);
ERROR: ExecAppend: Fail to add null value in not
null attribute col2
test=> INSERT INTO not_null_test (col1)
test-> VALUES (1);
ERROR: ExecAppend: Fail to add null value in not
null attribute col2
test=> INSERT INTO not_null_test VALUES (1, 1);
INSERT 174368 1
test=> UPDATE not_null_test SET col2 = NULL;
ERROR: ExecReplace: Fail to add null value in not
null attribute col2
Se uma constraint UNIQUE consistir de mais de uma coluna, o UNIQUE não pode ser usado como uma constraint de coluna. Em seu lugar, devemos usar uma linha UNIQUE separada na criação da tabela, para especificar uma nova coluna que fará a restrição. Esta abordagem cria um table constraint UNIQUE. A Listagem 4 mostra um constraint UNIQUE multicoluna.
Apesar de col1 ou col2 poderem não ser unívocas, um constraint requer que uma combinação de col1 e col2 seja unívoca. Por exemplo, em uma tabela que contém números de carteira de motorista de pessoas de vários estados, duas pessoas em estados diferentes poderão ter o mesmo número, porém uma combinação do estado e do número de carteira de motorista deverão sempre ser unívocos.
Listagem 2. Criação de tabela com constraint NOT NULL em coluna, adicionando-se valor DEFAULT.
test=> CREATE TABLE not_null_with_default_test (
test(> col1 INTEGER,
test(> col2 INTEGER NOT NULL DEFAULT 5
test(> );
CREATE
test=> INSERT INTO not_null_with_default_test (col1)
test-> VALUES (1);
...