Chaves Primárias Secundárias ou Chaves Únicas – Além das constraints Primary Key, também podemos utilizar constraints Unique, as quais asseguram que dados duplicados não sejam inseridos em colunas que não fazem parte das chaves primárias. A Unique é uma constraint que também é capaz de assegurar a exclusividade dos dados. Em uma tabela, várias colunas podem ser definidas com constraints Unique.
As colunas nas quais são definidas constraints Unique permitem a inclusão de valores nulos, desde que seja apenas um por coluna.
As constraints do tipo Unique podem ser utilizadas para referenciar uma chave estrangeira.
A chave primária usada na coluna CODVENDA não impediria que uma venda para o mesmo cliente fosse duplicada. Um exemplo disso já tem em nossa tabela, nos registros 1 e 4, onde há duas vendas exatamente iguais.
Neste caso, mesmo com a chave primária na coluna CODVENDA, essa inserção de uma mesma venda mais do que uma vez não seria evitada. Ao mesmo tempo, não seria viável exigir que os usuários consultassem a tabela inteira antes de inserir nela alguma informação (imagine uma tabela complexa, com milhares de registros).
Para resolver este problema, podemos inserir uma coluna RGCLIENTE como mostra a instrução a seguir:
Tendo em vista que não há duas pessoas com o mesmo RG, poderíamos colocar a chave primária nesta coluna a fim de evitar a inclusão de uma mesma venda duas ou mais vezes na tabela. Como já temos a chave primária na coluna CODVENDA e a mesma não pode se repetir devemos usar as chaves primárias secundárias, também chamadas de chaves únicas.
Desta forma, podemos colocar a chave primária na coluna CODVENDA para que cada linha seja identificada como única, e a chave única na coluna RGCLIENTE para evitar que valores já existentes na tabela sejam registrados novamente.
Chaves Estrangeiras – Colunas que representam chaves estrangeiras são utilizadas com a finalidade de estabelecer um vínculo entre os dados de tabelas distintas. A criação deste tipo de chave requer a utilização da constraint Foreign Key.
Para compreendermos este assunto de forma mais adequada, destacamos que para criarmos uma chave estrangeira é preciso que a coluna da primeira tabela, na qual se encontra a chave primária, seja referenciada pela coluna que se encontra na segunda tabela. Assim, a coluna da segunda tabela torna-se a chave estrangeira.
Vale destacar que não é necessário que uma constraint Foreign Key em uma tabela esteja vinculada apenas a uma constraint Primary Key em outra tabela. Além disso, embora a Foreign Key possa conter valores nulos, é possível que, nesta situação, a verificação dos valores que formam esta constraint não ocorra.
Podemos assegurar que a verificação dos valores de Foreign Key ocorra por meio da especificação do valor NOT NULL em todas as colunas que fazem parte deste tipo de constraint.
Para entendermos melhor os conceitos de chaves estrangeiras, vamos usar a tabela de Produtos, muito usada nos artigos anteriores de SQL Server. Antes vamos excluir a coluna CODPRODUTO, que permite valores nulos, para criá-la novamente mais a frente:
Agora na tabela Produtos, faça a seguinte instrução pra criarmos uma coluna que será a chave primária desta tabela, já que a mesma não contém chave primária:
Agora na tabela Vendas, iremos criar a chave estrangeira que irá referenciar a chave primária criada anteriormente na tabela Produtos. Para isso, use a seguinte instrução:
Na sintaxe acima criei a coluna CODPRODUTO, do tipo INT na tabela VENDAS, e já adicionei a constraint FOREIGN KEY, passando o nome a ela dentro dos parênteses e usando a cláusula REFERENCES, apontando a que tabela será feita o relacionamento dessa chave, que no caso é a PRODUTOS. Os parênteses finais são para passar a chave primária que será relacionada com a chave estrangeira que acabamos de criar.
Assim, está criada nossa chave estrangeira, relacionando uma venda a um produto. Você verá que nossa coluna está com o valor nulo, pois as chaves estrangeiras realmente aceitam valores nulos.
Na próxima e última parte veremos os conceitos e exemplos das chaves Check e Default e ver uma tabela com as regras de todas as constraints abordadas nas 3 partes desses artigos.
Não percam!