top
Loading...
1.8.5.5.外鍵
1.8.5.5. 外鍵

在MySQL服務器3.23.44和更高版本中,InnoDB存儲引擎支持對外鍵約束的檢查功能,這些約束包括CASCADEON DELETEON UPDATE。請參見15.2.6.4節,“FOREIGN KEY約束”。

對于InnoDB之外的其他存儲引擎,MySQL服務器能夠解析CREATE TABLE語句中的FOREIGN KEY語法,但不能使用或保存它。未來將進行擴展,能夠將這類信息保存到表規范文件中,以便能被mysqldump和ODBC檢索。稍后,還將為MyISAM表實現外鍵約束。

外鍵增強為數據庫開發人員提供了多項益處:

·         假定關聯設計恰當,外鍵約束使得程序員更難將不一致性引入數據庫。

·         數據庫服務器具有集中式約束檢查功能,因而沒有必要在應用程序一側執行這類檢查。這樣,就消除了不同應用程序使用不同方式檢查約束的可能性。

·         使用級聯更新和刪除,簡化了應用程序代碼。

·         設計恰當的外鍵有助于以文檔方式記錄表間的關系。

請記住,這些好處是以數據庫服務器為執行必要檢查而需的額外開銷為代價的。服務器額外檢查會影響性能,對于某些應用程序,該特性不受歡迎,應盡量避免。(出于該原因,在一些主要的商業應用程序中,在應用程序級別上實施了外鍵邏輯)。

MySQL允許數據庫開發人員選擇要使用的方法。如果你不需要外鍵,并希望避免與強制引用完整性有關的開銷,可選擇另一種表類型取而代之,如MyISAM。(例如,MyISAM存儲引擎為僅執行INSERTSELECT操作的應用程序提供了極快的性能,這是因為插入能和檢索同時進行)。請參見7.3.2節,“表鎖定事宜”。

如果你不打算利用引用完整性檢查具備的優點,請記住下述要點:

·         不存在服務器端外鍵關聯檢查時,應用程序本身必須處理這類關聯事宜。例如,將行按恰當順序插入表時應謹慎,并應避免產生孤立的子記錄。必須能夠在多記錄插入操作期間更正出現的錯誤。

·         如果ON DELETE是應用程序所需的唯一引用完整性功能,請注意,從MySQL服務器4.0起,可以使用多表DELETE語句,用單一語句從多個表中刪除行。請參見13.2.1節,“DELETE語法”。

·         從具有外鍵的表刪除記錄時,在缺少ON DELETE的情況下,一種解決方式是為應用程序增加恰當的DELETE語句。實際上,它與使用外鍵同樣快,而且移植性更好。

注意,使用外鍵在某些情況下會導致問題。

·         外鍵支持能處理很多引用完整性事宜,但仍需要仔細設計鍵的關系,以避免循環規則或不正確的級聯刪除組合。

·         DBA需要創建關聯拓撲,這會使從備份中恢復單獨表變得困難,該類情形并不罕見。(加載依賴其他表的表時,MySQL允許你臨時禁止外鍵檢查,從而降低了該難度)。請參見15.2.6.4節,“FOREIGN KEY約束”。在MySQL 4.1.1以前。重新加載時,mysqldump能夠生成自動利用該性能的轉儲文件。

注意,SQL中的外鍵用于檢查和強制引用完整性,而不是聯合表。如果打算用SELECT語句獲取多個表的結果,可在表之間執行聯合操作:

SELECT * FROM t1, t2 WHERE t1.id = t2.id;

請參見13.2.7.1節,“JOIN語法”。請參見3.6.6節,“使用外鍵”。

ODBC應用程序常使用不帶“ON DELETE ...”的FOREIGN KEY語法來生成自動WHERE子句。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/introduction.html
北斗有巢氏 有巢氏北斗