MySQL,外键约束没有任何区别

时间:2010-02-12 13:36:58

标签: mysql database foreign-keys constraints

我有一个数据库,有几个表。名为contacts的“主”表存储有关联系人的信息,每个联系人都有id,名称等...

我还有20个其他表,每个表代表某个功能,例如staffmedia ......

这些功能表中的每一个都使用外键引用联系表。我最近将这个约束添加到所有表中,使用以下查询,此处为表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,因此只有对表的更新才能在两个表中生效,但也没有效果。

1 个答案:

答案 0 :(得分:2)

您在问题中混淆了不同的概念。当您的数据库正确规范化后,对一个表中的数据的更改不应该在另一个表中产生后果。[*]

如果您要更改primary key并在另一个表follow中包含引用记录,则必须使用ON UPDATE CASCADE

如果ON UPDATE DELETE参考 ed 记录,则

DELETE仅删除参考 ing 记录。在您的示例中,如果您从contacts删除记录,则staff中引用已删除记录的所有记录也将被删除。

请阅读MySQL reference manual about foreign keys了解详情。

[*]如果您在包含相同信息的多个表中有相同的字段,则您有一个非规范化架构,这可能有助于提高性能,但需要您付出额外的努力(手动)更新时更新字段的所有副本。