我有一个数据库,有几个表。名为contacts
的“主”表存储有关联系人的信息,每个联系人都有id
,名称等...
我还有20个其他表,每个表代表某个功能,例如staff
,media
......
这些功能表中的每一个都使用外键引用联系表。我最近将这个约束添加到所有表中,使用以下查询,此处为表staff
:
ALTER TABLE staff ADD contactsConstraint FOREIGN KEY (c_id) REFERENCES contacts(id) ON UPDATE CASCADE ON DELETE CASCADE
。
如果我更改了联系人中的一行,我还希望更改显示在人员表中 - 反之亦然。但约束似乎没有什么区别!
它唯一能做的就是在我尝试向staff
添加一行时抛出错误,c_id
表中没有contacts
值。
我做错了什么?应该注意的是,我最近将数据库引擎更改为InnoDB,以确保我的约束可以正常工作。
我还尝试删除ON DELETE CASCADE
,因此只有对表的更新才能在两个表中生效,但也没有效果。
答案 0 :(得分:2)
您在问题中混淆了不同的概念。当您的数据库正确规范化后,对一个表中的数据的更改不应该在另一个表中产生后果。[*]
如果您要更改primary key
并在另一个表follow
中包含引用记录,则必须使用ON UPDATE CASCADE
。
ON UPDATE DELETE
参考 ed 记录,则 DELETE
仅删除参考 ing 记录。在您的示例中,如果您从contacts
删除记录,则staff
中引用已删除记录的所有记录也将被删除。
请阅读MySQL reference manual about foreign keys了解详情。
[*]如果您在包含相同信息的多个表中有相同的字段,则您有一个非规范化架构,这可能有助于提高性能,但需要您付出额外的努力(手动)更新时更新字段的所有副本。