Eu tenho uma tabela de "comentários" que modela uma conversa sobre um tópico, assim:
id serial
topic_id integer
parent_comment_id integer
body text
Portanto, todo comentário tem uma referência ao seu tópico E, eventualmente, seu comentário pai (se não for o primeiro comentário no tópico).
Gostaria de adicionar uma restrição que impediria a adição de linhas com tópico/pai incompatíveis (por exemplo, referenciando um tópico que não possui o comentário obrigatório ou, inversamente, um comentário que referencia o tópico errado).
Isso é possível? É necessário um gatilho?
(Para constar, eu tentei
ALTER TABLE comments ADD FOREIGN KEY (parent_comment_id, topic_id)
REFERENCES comments (id, topic_id)
mas reclama que there is no unique constraint matching given keys for referenced table "comments"
)
Você precisa adicionar superchave (índice/restrição exclusivo) em ambos (id,topic_id). Isso lhe dá a exclusividade de "alvo" para criar sua chave estrangeira. Isso funciona como uma restrição CHECK neste caso.
Nota: id permanece como chave primária para preservar o modelo. Mesmo que o id seja serial, seria errado, do ponto de vista da modelagem, alterar o PK para (id,topic_id)
Tentar
Se você quer que isso funcione:
Então, acredito que você precise alterar seu PK para estar nas colunas id e topic_id.
Além disso, acho que este link ajuda a explicar o que você precisa: http://www.postgresql.org/docs/8.1/static/ddl-constraints.html