PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Външни ключове, препращащи към други външни ключове в PostgreSQL

Ограничението на външния ключ не се интересува дали препратената(ите) колона(и) се позовава на самата друга колона. Но посочената(ите) колона(и) трябва бъдете уникални. Това ви казва съобщението за грешка (съвсем ясно).

Това, което ви липсва е, че чужд ключ ограничението може да се базира на множество колони . Това трябва да работи:

FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission

Замяна:

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

Кратката форма на синтаксиса (REFERENCES submission ) е възможно, защото препращате към първичния ключ, който е по подразбиране.

Освен това можете да опростите:направете submission.num първичния ключ на една колона, изпуснете излишните колони user_id и assignment_id от correction и намалете ограничението fk само до (num) - както е обсъдено в отговора на @Tim .

Докато имате ограничението fk с няколко колони, помислете за NOT NULL ограничения за всяка от препращащите колони (както е коментирано от @joop). В противен случай една или повече NULL стойности в препращащите колони позволяват избягване на ограничението fk с MATCH SIMPLE по подразбиране поведение. Това може или не може да е предвидено, обикновено не .
Алтернативно разгледайте MATCH FULL за многоколонни fk ограничения, за да позволи това само ако всички препращащите колони са NULL. Подробности:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да търсите enum в списък с низове чрез заявка postgresql?

  2. Postgres enum в TypeORM

  3. Защо Rails / ActiveRecord дава Postgres SyntaxError константа, която не е цяло число, в ORDER?

  4. След импортиране на данни в PostgreSQL, дублираната стойност на ключ нарушава уникалното ограничение

  5. Postgres now() срещу 'now' във функцията