2010-02-12 41 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