Batasan kunci asing tidak peduli apakah kolom yang direferensikan merujuk ke kolom lain itu sendiri. Tetapi kolom yang direferensikan harus Jadilah unik. Itulah pesan kesalahan yang memberitahu Anda (cukup jelas).
Yang Anda lewatkan adalah kunci asing batasan dapat didasarkan pada beberapa kolom . Ini akan berhasil:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Mengganti:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
Bentuk singkat dari sintaks (REFERENCES submission
) dimungkinkan, karena Anda mereferensikan kunci utama, yang merupakan default.
Plus, Anda dapat menyederhanakan:buat submission.num
kunci utama kolom tunggal, jatuhkan kolom yang berlebihan user_id
dan assignment_id
dari correction
dan kurangi batasan fk menjadi (num)
- seperti yang dibahas dalam jawaban @Tim
.
Selama Anda memiliki batasan fk multikolom, pertimbangkan NOT NULL
batasan pada setiap kolom referensi (seperti yang dikomentari oleh @joop). Jika tidak, satu atau lebih nilai NULL di kolom referensi memungkinkan untuk keluar dari batasan fk dengan MATCH SIMPLE
default perilaku. Ini mungkin disengaja atau tidak, biasanya tidak .
Atau pertimbangkan MATCH FULL
untuk batasan fk multicolumn hanya mengizinkan jika semua kolom referensi adalah NULL. Detail: