PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Clés étrangères faisant référence à d'autres clés étrangères dans PostgreSQL

Une contrainte de clé étrangère ne se soucie pas de savoir si la ou les colonnes référencées font elles-mêmes référence à une autre colonne. Mais la ou les colonnes référencées doivent être unique. C'est ce que le message d'erreur vous dit (assez clairement).

Ce qu'il vous manque, c'est qu'une clé étrangère la contrainte peut être basée sur plusieurs colonnes . Cela devrait fonctionner :

FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission

Remplacement :

FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)

La forme courte de la syntaxe (REFERENCES submission ) est possible, car vous faites référence à la clé primaire, qui est la valeur par défaut.

De plus, vous pouvez simplifier :faites submission.num la clé primaire à colonne unique, supprimez les colonnes redondantes user_id et assignment_id de correction et réduisez la contrainte fk à juste (num) - comme indiqué dans @Tim's answer .

Tant que vous avez la contrainte fk multicolonne, considérez NOT NULL contraintes sur chacune des colonnes de référence (comme commenté par @joop). Sinon, une ou plusieurs valeurs NULL dans les colonnes de référence permettent d'échapper à la contrainte fk avec la valeur par défaut MATCH SIMPLE comportement. Cela peut ou non être intentionnel, généralement ce n'est pas .
Vous pouvez également considérer MATCH FULL pour les contraintes fk multicolonnes pour n'autoriser que si tous les colonnes de référence sont NULL. Détails :