2010-02-12 21 views
1

我有一个数据库,有几个表。 “主”表,称为contacts,存储有关联系人的信息,每一个都具有id,姓名等..MySQL,外键约束没有任何区别

我也有一样,其他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,所以只有对表的更新才会在两个表中生效,但也没有效果。

+0

'如果我在联系人中更改了一行,我也希望更改显示在职员表'=>这听起来像是您在联系人和职员中存储了相同的字段信息。规范化! – lexu 2010-02-12 13:41:23

回答

2

你在混淆你的问题中的不同概念。当你的数据库是正确的标准化,更改数据在一个表中应该永远不会有结果的另一个表。[*]

如果你想改变primary key并有引用记录在另一张表follow的变化,你必须使用ON UPDATE CASCADE

ON UPDATE DELETE只删除和借鉴荷兰国际集团记录,如果你DELETE中借鉴记录。在你的例子中,如果你从contacts删除一条记录,那么staff引用删除记录的所有记录也会被删除。

有关更多信息,请阅读MySQL reference manual about foreign keys。如果在包含相同信息的多个表中有相同的字段,则表示非规范化模式,这可能对性能有好处,但需要额外努力(手动)更新所有副本更新它时的字段。

+0

好吧,所以'ON UPDATE CASCADE'只在更新主键时才起作用。 我想我必须手动更新表格。谢谢! – 2010-02-12 14:48:25