mysql有兩種常用的引擎型別:myisam和innodb。目前只有innodb引擎型別支援外來鍵約束。innodb中外鍵約束定義的語法如下:
[constraint [symbol]] foreign key
[index_name] (index_col_name, ...)
references tbl_name (index_col_name,...)
[on delete reference_option]
[on update reference_option]
reference_option:
restrict | cascade | set null | no action
外來鍵的使用需要滿足下列的條件:
1. 兩張表必須都是innodb表,並且它們沒有臨時表。
2. 建立外來鍵關係的對應列必須具有相似的innodb內部資料型別。
3. 建立外來鍵關係的對應列必須建立了索引。
4. 假如顯式的給出了constraint symbol,那symbol在資料庫中必須是唯一的。假如沒有顯式的給出,innodb會自動的建立。
如果子表試圖建立乙個在父表中不存在的外鍵值,innodb會拒絕任何insert或update操作。如果父表試圖update或者delete任何子表中存在或匹配的外鍵值,最終動作取決於外來鍵約束定義中的on update和on delete選項。innodb支援5種不同的動作,如果沒有指定on delete或者on update,預設的動作為restrict:
1. cascade: 從父表中刪除或更新對應的行,同時自動的刪除或更新自表中匹配的行。on delete canscade和on update canscade都被innodb所支援。
2. set null: 從父表中刪除或更新對應的行,同時將子表中的外來鍵列設為空。注意,這些在外鍵列沒有被設為not null時才有效。on delete set null和on update set set null都被innodb所支援。
3. no action: innodb拒絕刪除或者更新父表。
4. restrict: 拒絕刪除或者更新父表。指定restrict(或者no action)和忽略on delete或者on update選項的效果是一樣的。
5. set default: innodb目前不支援。
外來鍵約束使用最多的兩種情況無外乎:
1)父表更新時子表也更新,父表刪除時如果子表有匹配的項,刪除失敗;
2)父表更新時子表也更新,父表刪除時子表匹配的項也刪除。
前一種情況,在外鍵定義中,我們使用on update cascade on delete restrict;後一種情況,可以使用on update cascade on delete cascade。
innodb允許你使用alter table在乙個已經存在的表上增加乙個新的外來鍵:
alter table tbl_name
add [constraint [symbol]] foreign key
[index_name] (index_col_name, ...)
references tbl_name (index_col_name,...)
[on delete reference_option]
[on update reference_option]
innodb也支援使用alter table來刪除外來鍵:
alter table tbl_name drop foreign key fk_symbol;
mysql 外來鍵約束 型別
restrict方式 同no action,都是立即檢查外來鍵約束 限制,指的是如果字表引用父表的某個欄位的值,那麼不允許直接刪除父表的該值 cascade方式 在父表上update delete記錄時,同步update delete掉子表的匹配記錄 on delete cascade從mysql3...
mysql外來鍵和外來鍵約束
1.mysql中 鍵 和 索引 的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引 2.如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主...
mysql 外來鍵和外來鍵約束
1.外來鍵 如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。就是a表的主鍵,被用到了b表中,此時它就成了外來鍵 2.外來鍵約束 如果想要插入或者更新外來鍵的值,資料庫會和引用表中字段的資料進行驗證,如果插入或更改的值不在被引用的表中,則插入失敗 外來鍵的作用就是保證...