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 :