Ограничението на външния ключ не се интересува дали препратената(ите) колона(и) се позовава на самата друга колона. Но посочената(ите) колона(и) трябва бъдете уникални. Това ви казва съобщението за грешка (съвсем ясно).
Това, което ви липсва е, че чужд ключ ограничението може да се базира на множество колони . Това трябва да работи:
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. Подробности: