Aqui está uma tabela simples em que os registros podem fazer referência aos registros-pai na mesma tabela:
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
parent_id INT NULL,
num INT NOT NULL,
txt TEXT NULL,
FOREIGN KEY (parent_id) REFERENCES foo(id)
);
Com o requisito adicional de que um dos outros valores de campo ( num
) deva ser idêntico entre os registros pai e filho, pensei que uma chave estrangeira composta deveria fazer o truque. Eu mudei a última linha para
FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
e obteve ERRO: não há nenhuma restrição exclusiva correspondente às chaves fornecidas para a tabela referenciada "foo" .
Posso adicionar facilmente essa restrição, mas não entendo por que é necessário, quando uma das colunas referenciadas ( id
) já é garantida como única? Do meu ponto de vista, a nova restrição seria redundante.
NULL != NULL
. Enfim .. :)UNIQUE INDEX
onde as colunas estãoNULLABLE
.. e foi por isso que mencionei. :) Mas eu concordo - no caso de não haver NULLs (e nem um índice parcial), provavelmente é bastante direto.Chaves estrangeiras em geral (não apenas compostas) DEVEM apontar para uma CHAVE ÚNICA de algum tipo em outra tabela. Caso contrário, não haveria integridade relacional dos dados.
Isso está reclamando porque, enquanto você tem uma chave exclusiva ativada (id) .. NÃO possui uma chave exclusiva ativada (id, num) .. Portanto, no que diz respeito ao DB, o par (id, num) é não GARANTIDO para ser único. Nós, como seres humanos, podemos descobrir que será único, mas tenho certeza de que haveria um monte de código adicional que eles teriam que adicionar para tornar o Postgres inteligente o suficiente para ver que "oh, ei ... o ID deve ser único , então id, num também deve ser único "..
Eu ficaria muito surpreso se eles adicionassem esse código quando tudo que você precisa fazer é criar outro índice exclusivo nas duas colunas para corrigir o problema.
Só para esclarecer, o código que eles teriam que adicionar não seria apenas esse caso simples ... ele teria que lidar com todos os casos, mesmo aqueles onde a chave estrangeira está em mais de 4 colunas, etc. Tenho certeza a lógica seria bastante complexa.
fonte