2015-02-05 11:06 GMT-02:00 Matheus Saraiva <[email protected]>:

> Vamos imaginar o seguinte, temos uma nota com B.ID=3 e um orçamento com
> C.ID=4, na tabela A você teria então diversos registros com A.ID=3 e
> vários com A.ID=4. O problema é, se você tem duas FKs da coluna A.ID para
> B.ID e C.ID, quando A.ID for 3 a FK para C.ID vai ser violada, e quando
> A.ID=4 a FK para B.ID é que será violada. Exemplo:
>
>     postgres=# CREATE TEMP TABLE b(id integer PRIMARY KEY);
>     CREATE TABLE
>
>     postgres=# INSERT INTO b VALUES(3);
>     INSERT 0 1
>
>     postgres=# CREATE TEMP TABLE c(id integer PRIMARY KEY);
>     CREATE TABLE
>
>     postgres=# INSERT INTO c VALUES(4);
>     INSERT 0 1
>
>     postgres=# CREATE TEMP TABLE a(id integer, FOREIGN KEY (id) REFERENCES
> b(id), FOREIGN KEY (id) REFERENCES c(id));
>     CREATE TABLE
>
>     postgres=# INSERT INTO a VALUES(3);
>     ERROR:  23503: insert or update on table "a" violates foreign key
> constraint "a_id_fkey1"
>     DETAIL:  Key (id)=(3) is not present in table "c".
>     SCHEMA NAME:  pg_temp_2
>     TABLE NAME:  a
>     CONSTRAINT NAME:  a_id_fkey1
>     LOCATION:  ri_ReportViolation, ri_triggers.c:3232
>
>     postgres=# INSERT INTO a VALUES(4);
>     ERROR:  23503: insert or update on table "a" violates foreign key
> constraint "a_id_fkey"
>     DETAIL:  Key (id)=(4) is not present in table "b".
>     SCHEMA NAME:  pg_temp_2
>     TABLE NAME:  a
>     CONSTRAINT NAME:  a_id_fkey
>     LOCATION:  ri_ReportViolation, ri_triggers.c:3232
>
>
> ...
>
>
>
>
> Bem, segue um DER <http://oi61.tinypic.com/bhm25e.jpg> para tentar
> explicar.
>
> Como pode ser visto na imagem, o campo 'nota_ou_orca' da tabela 'ITENS' é
> a chave primária da tabela e também faz parte de duas chaves estrangeiras,
> uma que aponta para 'NOTA' outra que aponta para 'ORCAMENTO'.
> Tenho minhas dúvidas se daria certo. Tipo, na hora de inserir um registro
> em 'ITENS' qual tabela seria usada para validar a chave estrangeira, NOTA
> ou ORCAMENTO?
> Digamos que na tabela NOTAS exista registros mas que a tabela ORCAMENTO
> esteja vazia. A chave estrangeira que aponta para ORCAMENTO não lançaria um
> erro?


Realmente, não vai dar certo. Daria um erro exatamente como eu demonstrei,
veja acima.

Nesse caso nem mesmo em OO isso daria certo. Num modelo OO você deveria
armazenar o objeto NOTA ou o objeto ORCAMENTO na tabela ITENS, se você
quisesse armazenar num único atributo então NOTA e ORCAMENTO deveria herdar
de uma mesma classe (ou implementar uma mesma "interface"), que no caso
seria exatamente a ideia que comentei da tabela D.

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a