Foreign Key 

Eae pessoal, tudo bem?.

Vamos continuar nossos estudos sobre Primary  Key e Foreign Key, lembrando que para continuar é necessário ter lido a primeira parte (http://netcoders.com.br/primary-e-foreign-keys).

 

Voltando para nosso assunto sobre portas e chaves, vamos supor que eu tenho a uma tabela chamada porta, mas eu preciso de uma cópia de uma chave de uma porta para dar para uma pessoa, então como fazer uma cópia idêntica dachave e atribuir para outra pessoa?

createTable Porta

Preciso de uma referência daquela chave para que uma outra pessoa possa utiliza-la, porém, como vimos no último post, não posso criar uma primary key com o mesmo valor, como fazer?

Podemos criar uma tabela CopiaChave e colocar o valor da primary key como uma coluna, assim terei uma referência dela.

ptrCopiaCha

 

Uma boa prática quando referenciamos uma primary key para outra tabela é deixar o seu nome exato, pois fica mais fácil a localização da mesma.

Nossa tabela Porta, contém os seguintes dados :

prtPortaSelect

 

Para fazer uma referência na CopiaChave, basta inserir uma ChaveId com um valor que exista na tabela Porta .

 

insertCopiaChave

 

Mas pera ai , eu inseri uma ChaveId com valor 3 , mas na minha tabela Porta, não possuo este registro, como resolver a integridade das minhas referências?

Foreign Key

A criação de uma foreign key faz com que você garanta o relacionamento entre tabelas e a integridade dos dados que serão inseridos. Sendo assim, jamais poderemos inserir uma foreign key sem que ela exista na nossa primary key.

Para criarmos uma Foreign Key na criação da tabela, utilizamos o seguinte comando :

 FOREIGN KEY(Campo) REFERENCES Tabela(Campo)

Porém, como já possuimos a tabela criada iremos fazer o seguinte comando

addConstraint

O comando DELETE FROM Tabela serve para apagar todos os dados da tabela, usei isto pois havia inserido um ChaveId com valor 3, e como ele não existe , o SQL me retorna um erro de conflito.

FKINSERTKEy

 

Notem no lado esquerdo inferior que na coluna, o ChaveId entre parenteses ganhou a sigla FK, que  significa que aquele campo é Foreign Key e ao contrário de uma Primary Key, um campo Foreign Key pode ser nulo.

 

Vamos tentar inserir um ChaveId com valor 3 , lembrando que na nossa tabela Porta o valor do ChaveId vai até 2.

insertChaveIdNotExisting

 

O SQL nos retorna um erro de conflito, pois como não temos o valor  no campo ChaveId  da  tabela Porta ,  para fazer referência para a tabela CopiaChave.

 

Exemplos no Mundo Real

Um exemplo classico no mundo real é o relacionamentro entre as tabelas Estado e Cidade, uma Cidade possui um Estado, sendo assim precisamos  da referência do Estado na tabela Cidade .

EstadoCidade

 

Além do exemplo acima, vamos supor que possuamos Clientes e Funcionários, como ambas possuem Nome, Data de nascimento, RG  e Email, podemos criar uma tabela chamada Pessoa que terá estes dados e faremos uma referência dela nas tabelas Clientes e Funcionários, a vantagem é que não há uma repetição de dados no nosso banco. A vantagem de se ter uma tabela Pessoa é que um Cliente pode virar um Funcionário assim como o inverso, e não iremos precisar duplicar os dados, só fazer uma referência a nossa chave da tabela Pessoa.

PessoaClienteFuncionario

 

Observação:O campo DataNascimento esta como Date, no SQL possuimos algumas maneiras de guardar datas, na maioria das empresas em que eu trabalhei sempre guardavam com DATETIME que além de guardar a data, guarda também o horário, porém em 90 porcento dos casos precisamos somente da data por isto usei o DATE.

 

Bom pessoal, finalizamos os artigos sobre Primary Key e Foreign Key, qualquer dúvida ou sugestão podem me enviar.

 

Aline Haxkar Lavorato

Apaixonada por C# e SQL Server, acha que programar é igual a video-game ou seja perde horas conectada sem ver dia ou noite. Paixões recentes neste mundo de dev : AngularJS , NoSQL, Cordova e Ionic.

Facebook LinkedIn 

Comentários

comentarios