Omezení cizího klíče se nestará o to, zda odkazovaný sloupec (sloupky) odkazuje na jiný sloupec sám. Odkazované sloupce však musí buď jedinečný. To vám říká chybová zpráva (zcela jasně).
Chybí vám, že cizí klíč omezení může být založeno na více sloupcích . Mělo by to fungovat:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
Nahrazení:
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
Krátká forma syntaxe (REFERENCES submission
) je možné, protože odkazujete na primární klíč, který je výchozí.
Navíc můžete zjednodušit:vytvořte submission.num
primární klíč sinlge-column, vynechte nadbytečné sloupce user_id
a assignment_id
z correction
a omezit fk omezení na pouhé (num)
- jak je popsáno v @Timova odpověď
.
Pokud máte vícesloupcové omezení fk, zvažte NOT NULL
omezení na každém z odkazujících sloupců (jak komentoval @joop). Jinak jedna nebo více hodnot NULL v odkazujících sloupcích umožňuje uniknout omezení fk s výchozí MATCH SIMPLE
chování. To může, ale nemusí být zamýšleno, obvykle to není .
Alternativně zvažte možnost MATCH FULL
pro omezení fk s více sloupci to povolí pouze v případě, že všechny odkazující sloupce mají hodnotu NULL. Podrobnosti: