MySQL的外來鍵和參照完整性

2021-08-24 22:02:06 字數 1943 閱讀 8700

一、參照完整性(referential integrity)和外來鍵(foreign key)

參照完整性(referential integrity)是用於約定兩個關係之間的聯絡,理論上規定:若m是關係s中的一屬性組,且m是另一關係z的主關鍵字,則稱m為關係s對應關係z的外關鍵字。若m是關係s的外關鍵字,則s中每乙個元組在m上的值必須是空值或是對應關係z中某個元組的主關鍵字值。參照完整性是資料庫設計中乙個重要的概念。在系統不同的表中,當資料庫所有參照合法或非合法關聯時都會涉及到參照完整性。當參照完整性存在時,任何與不存在的記錄產生關聯將變得無效,由此可防止使用者出現各種錯誤,從而提供更為準確和實用的資料庫。

外來鍵(foreign key):如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主表,表b稱為從表。外來鍵是用來實現參照完整性的,不同的外來鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕鬆。

二、mysql中的外來鍵使用條件

mysql以往並不支援外來鍵,原因是這種支援會降低速度和效能。

在mysql 3.23.44版本後,innodb引擎型別的表支援了外來鍵約束,但是預設引擎myisam目前還不支援外來鍵,因此使用時需要注意建立資料庫表時選擇innodb作為資料庫引擎。

外來鍵的使用條件:

1.兩個表必須是innodb表,myisam表暫時不支援外來鍵(據說以後的版本有可能支援,目前我使用的是5.1.36還沒有支援);

2.外來鍵列必須建立了索引,mysql 4.1.2以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯示建立;

3.外來鍵關係的兩個表的列必須是資料型別相似,也就是可以相互轉換型別的列,比如int和tinyint可以,而int和char則不可以;

三、外來鍵的語法

[constraint symbol] foreign key [id] (index_col_name, ...)

references tbl_name (index_col_name, ...)

[on delete ]

[on update ]

該語法可以在 create table 和 alter table 時使用,如果不指定constraint symbol,mysql會自動生成乙個名字。

on delete、on update表示事件觸發限制,可設引數:

restrict(限制外表中的外來鍵改動)

cascade(跟隨外來鍵改動)

set null(設空值)

set default(設預設值)

no action(無動作,預設的)

具體使用示例可以參考講得很好。

四、外來鍵使用過程出現的問題

我在使用外來鍵的過程中遇到了幾個問題,在這裡講下。

1. 沒有使用innodb引擎

最初我忘了只有innodb才能使用外來鍵的限制了,並且在使用myisam引擎建立外來鍵的sql語句,並不會報錯,所以就沒有發現。在做插入資料測試的時候才發現並沒有進行參照完整性檢查。

檢查是否建立外來鍵的乙個方法是將建立資料表語句匯出檢查,可以採用phpmyadmin,或者使用語句

show create tabale

所檢查執行的sql語句,可以看到顯示出的建立資料表語句中根本沒有包含建立外來鍵語句。

2. 外來鍵關係的兩個表的列的資料型別不匹配

在修改完資料庫引擎後,有遇到了乙個問題,資料型別不匹配。執行建表sql語句,只顯示"error 1005 (hy000): can't create table 'geoinfosys.route' (errno: 150)」錯誤。檢查一遍沒有發現有任何錯誤。

這是使用命令:

mysql>show engine innodb status;

在"latest foreign key error"中顯示了建立的錯誤。

我這裡顯示是:

在仔細檢查發現主表中的型別是 int unsigned,而從表中定義的型別是int,修改完就成功了。以後一定要注意仔細啊。

mysql 參照完整性 mysql參照完整性

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 mysql支援資料庫的參照完整性約束嗎?有四個表 表一的主鍵是的表二外鍵 表二的主鍵是表三的外來鍵 表三的主鍵是表四的外來鍵 請問 如果 刪除表一 表2 3 4 會自動刪除嗎?從 3.23.43b 開始 innodb 支援外來鍵約束特性。innodb 表...

mysql 參照完整性 mysql參照完整性

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 mysql支援資料庫的參照完整性約束嗎?有四個表 表一的主鍵是的表二外鍵 表二的主鍵是表三的外來鍵 表三的主鍵是表四的外來鍵 請問 如果 刪除表一 表2 3 4 會自動刪除嗎?從 3.23.43b 開始 innodb 支援外來鍵約束特性。innodb 表...

索引 外來鍵之參照完整性

思考兩個問題 問題一 我們有兩個表,乙個表 department 存放的是部門的資訊,例如部門id,部門名稱等 另乙個表是員工表 staff 員工表裡面肯定要存放每個員工所在的部門。那問題來了,如果我們這個時候刪除了部門表中的某條記錄,在staff表中會發生什麼?問題二 是否有必要給外來鍵加索引。為...