外部キー制約は、参照されている列が別の列自体を参照しているかどうかを気にしません。ただし、参照される列は必須 一意であること。それがエラーメッセージからわかることです(非常に明確です)。
不足しているのは、外部キーです。制約は複数の列に基づくことができます 。これは機能するはずです:
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
)デフォルトである主キーを参照しているため、可能です。
さらに、単純化することができます:make submission.num
sinlge-column主キー、冗長列user_id
を削除します およびassignment_id
correction
から fk制約を(num)
だけに減らします -@Timの回答
で説明されているように 。
複数列のfk制約がある限り、NOT NULL
を検討してください。 参照する各列の制約(@joopによるコメント付き)。それ以外の場合、参照列の1つ以上のNULL値を使用すると、デフォルトのMATCH SIMPLE
を使用してfk制約をエスケープできます。 行動。これは意図されている場合と意図されていない場合があり、通常は ではありません。 。
または、MATCH FULL
を検討してください 複数列のfk制約の場合、すべての場合にのみ許可します。 参照列がNULLです。詳細: