外键约束不关心所引用的列是否在引用另一列本身。但是引用的列 必须 是唯一的。这就是错误消息告诉您的内容(非常清楚)。
您缺少的是外键约束可以基于
多个列 。这应该工作:
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)的简短形式是可能的,因为您要引用主键,这是默认键。
另外,您可以简化:制作
submission.numsinlge-
column主键,从中删除冗余列
user_id,并将fk约束减小为just-如@Tim的答案中所述。
assignment_id``correction``(num)
只要您具有multicolumn fk约束,请考虑
NOTNULL每个引用列上的约束(如@joop所述)。另外,引用列中的一个或多个NULL值允许使用默认
MATCHSIMPLE行为来逃避fk约束。这可能是预期的,也可能不是预期的,通常 不是 。
或者,考虑
MATCH FULL多列fk约束,以仅在 所有 引用列均为NULL的情况下才允许这样做。细节:
- 完全匹配与简单匹配



