我的问题是我不知道,我无法弄清楚是否可能有两个不同的主键引用相同的外部键。更具体地说,我有三个表。第一个表称为人员,其属性为:id fname lname password
。第二张表称为学生,其属性为id fname lname password role
,最后一张表为message,它的第四个表为message,它具有4个属性:id text date user_fk
,我希望两个主键引用外部键。在phpmyadmin中非常简单,我做到了。问题是,当我想输入新行时,我想数据库无法确定主键是来自职员表还是来自学生。我收到的消息是:#1452 - Cannot add or update a child row: a foreign key constraint fails (
diss .
消息, CONSTRAINT
student_fk FOREIGN KEY (
user_fk ) REFERENCES
student (
studentid ))
。所以我的问题是:我想做什么完全错误吗?例如,也许最好创建另一个仅存储上述键的表?还是错误是我找不到的其他地方?谢谢!
答案 0 :(得分:0)
如果我对您的理解正确,则user_fk
中的外键message
是指student
和staff
的ID。
在这种情况下,如果您尝试将数据插入到message
表中,它将检查两个表student
和staff
中的ID。因此是错误。
您可以做的是在message
中为所引用的每个表添加两个外键列。
更新
以上方法将导致可为空的外键的可能性。相反,我们可以有两个映射表,每个表一个。例如:student_message_map
和staff_message_map
。每个表将包含2个外键student_id
和message_id
/ staff_id
和message_id
。
这将使列不可为空,但查询将需要进行两次连接。另外,由于映射表的原因,查看此关系的人可能会认为这是多对多关系。
具有可为空的外键的IMO并不是一个好习惯,您只需要在查询时注意有关空值的可能性即可。