estrangeira especifica que o valor da coluna (ou grupo de colunas) deve corresponder a algum valor existente em uma linha de outra tabela. Diz-se que a chave estrangeira mantem a integridade referencial entre duas tabelas relacionadas.Supondo que ja temos a tabela de produtos utilizada diversas vezes anteriormente:CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric);Agora vamos assumir a existencia de uma tabela armazenando os pedidos destes produtos. Desejamos garantir que a tabela de pedidos contenha somente pedidos de produtos que realmente existem. Para isso e definida uma restricao de chave estrangeira na tabela de pedidos fazendo referencia a tabela de produtos:CREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, cod_prod integer REFERENCES produtos (cod_prod), quantidade integer);Isto torna impossivel criar um pedido com cod_prod nao existente na tabela de produtos.Nesta situacao e dito que a tabela de pedidos e a tabela que faz referencia, e a tabela de produtos e a tabela referenciada. Da mesma forma existem colunas fazendo referencia e sendo referenciadas.O comando acima pode ser abreviado escrevendoCREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, cod_prod integer REFERENCES produtos, quantidade integer);porque, na ausencia da lista de colunas, a chave primaria da tabela referenciada e usada como a coluna referenciada.A chave estrangeira tambem pode restringir e referenciar um grupo de colunas. Como usual, e necessario ser escrito na forma de restricao de tabela. Abaixo esta mostrado um exemplo artificial da sintaxe:CREATE TABLE t1 ( a integer PRIMARY KEY, b integer, c integer, FOREIGN KEY (b, c) REFERENCES outra_tabela (c1, c2));Obviamente, o numero e tipo das colunas na restricao devem corresponder ao numero e tipo das colunas referenciadas.Pode ser atribuido um nome a restricao de chave estrangeira da forma habitual.Uma tabela pode conter mais de uma restricao de chave estrangeira, o que e utilizado para implementar relacionamentos muitos-para-muitos entre tabelas. Digamos que existam as tabelas de produtos e de pedidos, e desejamos permitir que um pedido posa conter varios produtos (o que nao e permitido na estrutura anterior). Podemos, entao, utilizar a seguinte estrutura de tabela:CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric);CREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, endereco_entrega text, ...);CREATE TABLE itens_pedidos ( cod_prod integer REFERENCES produtos, cod_pedido integer REFERENCES pedidos, quantidade integer, PRIMARY KEY (cod_prod, cod_pedido));Deve ser observado, tambem, que a chave primaria esta sobreposta as chaves estrangeiras na ultima tabela.Sabemos que a chave estrangeira nao permite a criacao de pedidos nao relacionados com algum produto. Porem, o que acontece se um produto for removido apos a criacao de um pedido fazendo referencia a este produto? A linguagem SQL permite tratar esta situacao tambem. Intuitivamente temos algumas opcoes:Nao permitir a exclusao de um produto referenciadoExcluir o pedido tambemAlgo mais?Para ilustrar esta situacao, vamos implementar a seguinte politica no exemplo de relacionamento muitos-para-muitos acima: Quando se desejar remover um produto referenciado por um pedido (atraves de itens_pedidos), isto nao sera permitido. Se um pedido for removido, os itens do pedido tambem serao removidos.CREATE TABLE produtos ( cod_prod integer PRIMARY KEY, nome text, preco numeric);CREATE TABLE pedidos ( cod_pedido integer PRIMARY KEY, endereco_entrega text, ...);CREATE TABLE