Ograniczenie klucza obcego nie ma znaczenia, czy odwoływane kolumny odwołują się do innej kolumny. Ale wskazane kolumny muszą być wyjątkowym. Tak mówi komunikat o błędzie (dość wyraźnie).
Brakuje Ci klucza obcego ograniczenie może opierać się na wielu kolumnach . To powinno działać:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Wymiana:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
Krótka forma składni (REFERENCES submission
) jest możliwe, ponieważ odwołujesz się do klucza podstawowego, który jest domyślny.
Dodatkowo możesz uprościć:make submission.num
klucz podstawowy pojedynczej kolumny, usuń nadmiarowe kolumny user_id
i assignment_id
z correction
i zmniejsz ograniczenie fk do (num)
- jak omówiono w @Odpowiedź Tima
.
Dopóki masz ograniczenie wielokolumnowe fk, rozważ NOT NULL
ograniczenia na każdej z kolumn odniesienia (jak skomentował @joop). W przeciwnym razie jedna lub więcej wartości NULL w kolumnach odniesienia pozwala uciec od ograniczenia fk z domyślnym MATCH SIMPLE
zachowanie. Może to być zamierzone lub nie, zazwyczaj nie .
Alternatywnie rozważ MATCH FULL
dla wielokolumnowych ograniczeń fk, aby zezwolić na to tylko wtedy, gdy wszystkie kolumny odniesienia mają wartość NULL. Szczegóły: