Ràng buộc khóa ngoại không quan tâm liệu (các) cột được tham chiếu có đang tham chiếu đến chính cột khác hay không. Nhưng (các) cột được tham chiếu phải là duy nhất. Đó là những gì thông báo lỗi cho bạn biết (khá rõ ràng).
Điều bạn đang thiếu là khóa ngoại ràng buộc có thể dựa trên nhiều cột . Điều này sẽ hoạt động:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Thay thế:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
Dạng ngắn gọn của cú pháp (gửi REFERENCES submission
) là có thể, vì bạn đang tham chiếu đến khóa chính, là khóa mặc định.
Ngoài ra, bạn có thể đơn giản hóa:make submission.num
khóa chính sinlge-column, thả các cột thừa user_id
và assignment_id
từ correction
và giảm ràng buộc fk xuống chỉ (num)
- như đã thảo luận trong câu trả lời của @ Tim
.
Miễn là bạn có ràng buộc fk nhiều cột, hãy xem xét NOT NULL
ràng buộc trên mỗi cột tham chiếu (như nhận xét của @joop). Ngoài ra, một hoặc nhiều giá trị NULL trong các cột tham chiếu cho phép thoát khỏi ràng buộc fk với MATCH SIMPLE
mặc định hành vi. Điều này có thể được dự định hoặc không, thường là không .
Ngoài ra, hãy xem xét MATCH FULL
đối với ràng buộc fk nhiều cột chỉ cho phép điều đó nếu tất cả các cột tham chiếu là NULL. Chi tiết: