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
