PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Chiavi esterne che fanno riferimento ad altre chiavi esterne in PostgreSQL

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: