itens_pedidos ( cod_prod integer REFERENCES produtos ON DELETE RESTRICT, cod_pedido integer REFERENCES pedidos ON DELETE CASCADE, quantidade integer, PRIMARY KEY (cod_prod, cod_pedido));As duas opcoes mais comuns sao restringir, ou excluir em cascata. RESTRICT nao permite excluir a linha referenciada. NO ACTION significa que, se as linhas referenciadas ainda existirem quando a restricao for verificada, sera gerado um erro; este e o comportamento padrao se nada for especificado (A diferenca essencial entre estas duas opcoes e que NO ACTION permite postergar a verificacao para mais tarde na transacao, enquanto RESTRICT nao permite). CASCADE especifica que, quando a linha referenciada e excluida, as linhas que fazem referencia tambem devem ser excluidas automaticamente. Existem outras duas opcoes: SET NULL e SET DEFAULT. Estas opcoes fazem com que as colunas que fazem referencia sejam definidas como nulo ou com o valor padrao, respectivamente, quando a linha referenciada e excluida. Deve ser observado que isto nao evita a observancia das restricoes. Por exemplo, se uma acao especificar SET DEFAULT, mas o valor padrao nao satisfizer a chave estrangeira, a operacao nao sera bem-sucedida.Semelhante a ON DELETE existe tambem ON UPDATE, chamada quando uma coluna referenciada e alterada (atualizada). As acoes possiveis sao as mesmas.Para terminar, devemos mencionar que a chave estrangeira deve referenciar colunas de uma chave primaria ou de uma restricao de unicidade. Se a chave estrangeira fizer referencia a uma restricao de unicidade, existem algumas possibilidades adicionais sobre como os valores nulos serao correspondidos. Esta parte esta explicada na documentacao de referencia para CREATE TABLE. Exemplos do tradutorRestricao de unicidade com valor nulo em chave unica simplesAbaixo sao mostrados exemplos de insercao de linhas contendo valor nulo no campo da chave unica simples da restricao de unicidade. Deve ser observado que, nestes exemplos, o PostgreSQL e o Oracle consideram os valores nulos diferentes.PostgreSQL 8.0.0:=> \pset null '(nulo)'=> CREATE TABLE tbl_unique (c1 int UNIQUE);=> INSERT INTO tbl_unique VALUES (1);=> INSERT INTO tbl_unique VALUES (NULL);=> INSERT INTO tbl_unique VALUES (NULL);=> INSERT INTO tbl_unique VALUES (2);=> SELECT * FROM tbl_unique; c1-------- 1 (nulo) (nulo) 2(4 linhas)SQL Server 2000:CREATE TABLE tbl_unique (c1 int UNIQUE)INSERT INTO tbl_unique VALUES (1)INSERT INTO tbl_unique VALUES (NULL)INSERT INTO tbl_unique VALUES (NULL)Violation of UNIQUE KEY constraint 'UQ__tbl_unique__37A5467C'.Cannot insert duplicate key in object 'tbl_unique'.The statement has been terminated.INSERT INTO tbl_unique VALUES (2)SELECT * FROM tbl_uniquec1-----------NULL12(3 row(s) affected)Oracle 10g:SQL> SET NULL (nulo)SQL> CREATE TABLE tbl_unique (c1 int UNIQUE);SQL> INSERT INTO tbl_unique VALUES (1);SQL> INSERT INTO tbl_unique VALUES (NULL);SQL> INSERT INTO tbl_unique VALUES (NULL);SQL> INSERT INTO tbl_unique VALUES (2);SQL> SELECT * FROM tbl_unique; C1---------- 1(nulo)(nulo) 2 Restricao de unicidade com valor nulo em chave unica compostaAbaixo sao mostrados exemplos de insercao de linhas contendo valores nulos em campos da chave unica composta da restricao de unicidade. Deve ser observado que, nestes exemplos, somente o PostgreSQL considera os valores nulos diferentes.PostgreSQL 8.0.0:=> \pset null '(nulo)'=> CREATE TABLE tbl_unique (c1 int, c2 int, UNIQUE (c1, c2));=> INSERT INTO tbl_unique VALUES (1,1);=> INSERT INTO tbl_unique VALUES (1,NULL);=> INSERT INTO tbl_unique VALUES (NULL,1);=> INSERT INTO tbl_unique VALUES (NULL,NULL);=> INSERT INTO tbl_unique VALUES (1,NULL);=> SELECT * FROM tbl_unique; c1 | c2--------+-------- 1 |