Restrição de banco de dados ou database constraint, chave estrangeira ou foreign key. Neste tópico, vamos começar analisando um modelo de dados na terceira forma normal. Vamos lá! Eu quero chamar sua atenção para dois relacionamentos que nós temos aqui. Então, ao centro, nós temos uma tabela chamada Order Details, detalhes da ordem ou item de pedido, detalhe do pedido. E nós vamos ver que, do lado direito, nós temos um relacionamento com a tabela de orders, tabela de pedido, e lendo este relacionamento da direita para a esquerda, nós temos a seguinte leitura, que uma ordem tem muitos detalhes. Então, este é um relacionamento importante, uma modelagem muito comum em sistemas transacionais, sistemas de vendas. uma modelagem muito comum em sistemas transacionais, sistemas de vendas. E, ao lado esquerdo, nós temos um relacionamento do detalhe desta ordem com um produto. Então, lendo o relacionamento agora da esquerda para a direita, nós temos que um produto tem muitos detalhes de pedido. Pois bem, vamos prestar atenção que cada uma dessas três tabelas que estamos detalhando aqui neste modelo, possuem chaves primárias, como nós comentamos na aula anterior. O produto é identificado pelo Product ID. A Order Detail é identificada pela Order Detail ID e na Order nós temos o Order ID. Ok, então com base neste conceito de chave primária, vamos evoluir para o conceito da chave estrangeira. evoluir para o conceito da chave estrangeira. Observando Order Details, nós vamos perceber que tem Order ID e Product ID, que são exatamente as chaves primárias dessas respectivas tabelas que estamos comentando, produtos e pedidos. Então, do ponto de vista da tabela Order Details, nós temos chaves estrangeiras que estão referenciando chaves primárias das tabelas produto e pedido, orders. Neste momento, nós, quando utilizamos esta referência, esta criação de relacionamento entre entidades de negócio, que tecnicamente no banco de dados é uma tabela referenciando outras tabelas, estas chaves de relacionamento serão obrigatoriamente chaves primárias ou ainda atributos únicos, atributos do tipo unique. Mas a regra aqui que nós temos que prestar atenção é o seguinte, para cada linha na order details nós teremos uma correspondência de um produto e de um pedido. Vamos detalhar mais este conceito desta constraint que é a foreign key. Bom, como eu comentei, a ideia é uma referência às colunas primary key de outras tabelas e esta restrição, esta constraint, vai criar este relacionamento entre essas tabelas. Então, esta restrição é muito importante para garantir a integridade referencial em um banco de dados. Neste momento, quando falamos de integridade referencial, nós vamos perceber que entidades serão pais e filhas de outras entidades. Neste caso, Order Details, que está referenciando Products e Orders, torna-se filha de ambas as tabelas. E com isso, existem obrigações que vão acontecer neste banco de dados, como, por exemplo, não é possível excluir um pedido se este pedido tiver detalhes de ordem. E também não é possível excluir um pedido se este pedido possuir detalhes de pedidos, linhas de pedidos. Então, este conceito que permeia, está presente nos projetos com bancos de dados relacionais e na modelagem de dados em terceira forma normal, é totalmente dependente deste conceito importante que é a foreign key. Avançando um pouco mais, e aí resgatando o que eu comentei na nossa introdução, nós precisamos, na tabela PAII encontrar um registro que seja único, identificador único. Então, por esta razão, somente atributos que sejam primary key ou que sejam unique serão possíveis de serem referenciados. Então, a ideia é que na foreign key exista exatamente um único registro, uma única ocorrência na tabela pai. E como eu comentei, caso seja efetuada alguma operação nas tabelas pais, isso não poderá acontecer, essa exclusão não poderá acontecer, caso existam filhos deste pai. Vamos aos comandos. Em oracle, nós temos aqui a criação da tabela empregado e neste empregado nós vamos perceber aqui dois relacionamentos interessantes. Vamos prestar atenção no atributo gerente dessa pessoa que está empregada nessa organização. Aqui eu quero chamar a atenção para o seguinte. O gerente também é um empregado. Então, aqui nós estamos implementando um autorrelacionamento. Uma pessoa é gerida por outra pessoa. Um empregado é gerido por outro empregado. E o empregado gere outro empregado é gerido por outro empregado e o empregado gere outro empregado. Então, tecnicamente, aqui na nossa linha de comando, nós vamos perceber que o atributo gerente é um número, então atributo numérico, estamos aqui explicitamente nomeando esta constraint, então keyword constraint e o nome gerente FK, que é o meu padrão de nomenclatura da minha organização, do meu projeto, faz uma referência de chave estrangeira, foreign key, para o atributo gerente. E este atributo referencia a tabela empregado no empregado ID. Então, nessas linhas, para o atributo gerente, nós estamos criando um auto-relacionamento. Logo em seguida, em departamento, nós estamos dizendo o seguinte, que esta pessoa empregada está lotada em uma unidade de negócio, em um departamento dessa organização. departamento dessa organização. Então, por essa razão, nós estamos criando uma Constraints, também com nome explicitado de departamento FK, que segue as minhas regras de nomenclatura, e estou declarando chave estrangeira departamento ID que referencia, references, tabela departamento no atributo departamento ID. Então, com isso, neste comando, nós estamos tratando dois tipos de relacionamento. Relacionamento com outra tabela, como nós vimos no exemplo, na introdução aqui desta aula, e também já estamos avançando um pouco mais no conceito com um autorrelacionamento, que é muito comum, um autorrelacionamento clássico nas discussões de modelagem de dados que é o empregado tendo o seu gestor outro empregado então esses dois temas aqui são bastante importantes e bastante interessantes para a gente observar na nossa modelagem de dados e na nossa implementação de constraints avançando em MySQL e na nossa implementação de constraints. Avançando em MySQL. Então aqui nós estamos criando a Product Order e aqui o MySQL tem uma sintaxe um pouquinho diferente. Então estou declarando como Primary Key o Product Number, que é o Product NO. Estou declarando índices, categoria de produto e o ID do produto e o Customer ID E mais ao final aqui do nosso trecho de SQL Aparece exatamente o Foreign Key E aqui nós temos uma Foreign Key composta Então temos dois atributos, duas colunas Que é o Product Category e o Product ID Que referenciam na tabela produto, Product Os respectivos atributos Category e o Product ID, que referenciam na tabela produto, Product, os respectivos atributos Category e ID. Embaixo nós temos a Customer ID, Foreign Key Customer ID, que referencia a tabela Customer também pode ser composta exatamente como acontece na chave primária. O importante aqui sempre é estabelecer o atributo que permita ter a exclusividade, ou seja, que aquele registro tenha um identificador único na tabela. registro tem um identificador único na tabela. Em SQL Server, aqui a gente trouxe um alter table, também estou nomeando explicitamente no comando esta constrência, fkorderdetail, productid, foreign key é o atributo productid que vai referenciar a tabela produto, Product, em Product ID também. Embaixo, a mesma coisa, Purchase Detail com Product Code que referencia a tabela produto, código de produto então o nosso produto aqui tem uma chave é a sua chave primária o produto ou perdão a sua chave natural o produto ou de um código de produto funcional que possui a característica e o nick está sendo referenciada como chave estrangeira de detalhe de compra, de purchase detail. Então, aqui nós temos aquele segundo cenário que eu comentei que é possível você fazer uma chave estrangeira com um atributo do tipo unique. Então, o product ID é o primary key e o product code é unique code. E em pós-tributos, nós temos aqui tabelararia, com uma constrante nomeada de forma explícita, que é a Livraria Livro, cuja foreign key é o código do nosso livro, o ISBN, que referencia livro no seu atributo ISBN de mesmo nome. Aqui no posto que nós vamos entrar em alguns outros conceitos, vai aparecer esses dois comandos adicionais, not deferable e initially immediate, que nós não vamos nos aprofundar agora, mas determinam o momento da validação dessa regra, dessa regra de integridade referencial. Se acontece durante a execução da transação ou ao final dessa execução. durante a execução da transação ou ao final dessa execução. Mas o nosso foco aqui é muito mais a gente enxergar a criação de referências, que são os relacionamentos que existem entre uma tabela e outra, e que estes relacionamentos somente vão poder acontecer com atributos únicos na outra tabela, acontecer com atributos únicos na outra tabela e os atributos únicos vão ser aqueles que ou terão a Constraint de Primary Key ou a Constraint Unique na tabela pai e consequentemente na tabela filho receberão a nossa Constraint em discussão aqui que é a Foreign Key ou chave estrangeira.