A un vincolo di chiave esterna non interessa se le colonne a cui si fa riferimento fanno riferimento a un'altra colonna stessa. Ma le colonne di riferimento devono essere unico. Questo è ciò che ti dice il messaggio di errore (abbastanza chiaramente).
Quello che ti manca è una chiave esterna il vincolo può essere basato su più colonne . Questo dovrebbe funzionare:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Sostituzione:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
La forma abbreviata della sintassi (REFERENCES submission
) è possibile, perché stai facendo riferimento alla chiave primaria, che è l'impostazione predefinita.
Inoltre, puoi semplificare:fai submission.num
la chiave primaria della colonna singola, elimina le colonne ridondanti user_id
e assignment_id
da correction
e riduci il vincolo fk a solo (num)
- come discusso in Risposta di @Tim
.
Finché hai il vincolo fk multicolonna, considera NOT NULL
vincoli su ciascuna delle colonne di riferimento (come commentato da @joop). Altrimenti, uno o più valori NULL nelle colonne di riferimento consentono di sfuggire al vincolo fk con il valore predefinito MATCH SIMPLE
comportamento. Questo può essere inteso o meno, in genere non .
In alternativa, considera MATCH FULL
per i vincoli fk multicolonna per consentirlo solo se tutti le colonne di riferimento sono NULL. Dettagli: