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