sql >> Database >  >> RDS >> PostgreSQL

Externe sleutels die verwijzen naar andere externe sleutels in PostgreSQL

Een externe-sleutelbeperking maakt het niet uit of de kolom(men) waarnaar wordt verwezen zelf verwijst naar een andere kolom. Maar de kolom(men) waarnaar wordt verwezen moeten wees uniek. Dat is wat de foutmelding je vertelt (heel duidelijk).

Wat je mist is dat een buitenlandse sleutel beperking kan gebaseerd zijn op meerdere kolommen . Dit zou moeten werken:

FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission

Vervangen:

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

De korte vorm van de syntaxis (REFERENCES submission ) is mogelijk, omdat u verwijst naar de primaire sleutel, de standaardsleutel.

Bovendien kun je het vereenvoudigen:maak submission.num de primaire sleutel met één kolom, laat de overbodige kolommen user_id . vallen en assignment_id van correction en verminder de fk-beperking tot slechts (num) - zoals besproken in @Tim's antwoord .

Zolang je de fk-beperking met meerdere kolommen hebt, overweeg dan NOT NULL beperkingen op elk van de verwijzende kolommen (zoals becommentarieerd door @joop). Anders kunnen een of meer NULL-waarden in de verwijzende kolommen ontsnappen aan de fk-beperking met de standaard MATCH SIMPLE gedrag. Dit kan al dan niet de bedoeling zijn, meestal is het niet .
Overweeg ook MATCH FULL voor fk-beperkingen met meerdere kolommen om dat alleen toe te staan ​​als alle verwijzende kolommen zijn NULL. Details:



  1. Hoe voer ik deze twee query's uit in php?

  2. Filter toepassen in Oracle View

  3. Grote website overschakelen van MySQL naar MySQLi

  4. Hoe alle tabelvoorvoegsels in een enkele query te wijzigen