在mysql中myisam和innodb儲存引擎都支援外來鍵(foreign key),但是myisam只能支援語法,卻不能實際使用。下面通過例子記錄下innodb中外鍵的使用方法:
建立主表:
mysql> create table parent(id int not null,primary key(id)) engine=innodb;
query ok, 0 rows affected (0.04 sec)
建立從表:
mysql> create table child(id int,parent_id int,foreign key (parent_id) references parent(id) on delete cascade) engine=innodb;
query ok, 0 rows affected (0.04 sec)
插入主表測試資料:
mysql> insert into parent values(1),(2),(3);
query ok, 3 rows affected (0.03 sec)
records: 3 duplicates: 0 warnings: 0
插入從表測試資料:
mysql> insert into child values(1,1),(1,2),(1,3),(1,4);
error 1452 (23000): cannot add or update a child row: a foreign key constraint fails (`test/child`, constraint `child_ibfk_1` foreign key (`parent_id`) references `parent` (`id`) on delete cascade)
因為4不在主表中,插入時發生了外來鍵約束錯誤。
只插入前三條:
mysql> insert into child values(1,1),(1,2),(1,3);
query ok, 3 rows affected (0.03 sec)
records: 3 duplicates: 0 warnings: 0
成功!
刪除主表記錄,從表也將同時刪除相應記錄:
mysql> delete from parent where id=1;
query ok, 1 row affected (0.03 sec)
mysql> select * from child;
+------+-----------+
| id | parent_id |
+------+-----------+
| 1 | 2 |
| 1 | 3 |
+------+-----------+
2 rows in set (0.00 sec)
更新child中的外來鍵,如果對應的主鍵不存在,則報錯:
mysql> update child set parent_id=4 where parent_id=2;
error 1452 (23000): cannot add or update a child row: a foreign key constraint fails (`test/child`, constraint `child_ibfk_1` foreign key (`parent_id`) references `parent` (`id`) on delete cascade)
如果改為主表中存在的值,則可以正常更新:
mysql> update child set parent_id=2 where parent_id=2;
query ok, 0 rows affected (0.01 sec)
rows matched: 1 changed: 0 warnings: 0
如果要在父表中更新或者刪除一行,並且在子表中也有一行或者多行匹配,此時子表的操作有5個選擇:
· cascade: 從父表刪除或更新且自動刪除或更新子表中匹配的行。on delete cascade和on update cascade都可用。在兩個表之間,你不應定義若干在父表或子表中的同一列採取動作的on update cascade子句。
· set null: 從父表刪除或更新行,並設定子表中的外來鍵列為null。如果外來鍵列沒有指定not null限定詞,這就是唯一合法的。on delete set null和on update set null子句被支援。
· no action: 在ansi sql-92標準中,no action意味這不採取動作,就是如果有乙個相關的外鍵值在被參考的表裡,刪除或更新主要鍵值的企圖不被允許進行(gruber, 掌握sql, 2000:181)。 innodb拒絕對父表的刪除或更新操作。
· restrict: 拒絕對父表的刪除或更新操作。no action和restrict都一樣,刪除on delete或on update子句。(一些資料庫系統有延期檢查,並且no action是乙個延期檢查。在mysql中,外來鍵約束是被立即檢查的,所以no action和restrict是同樣的)。
· set default: 這個動作被解析程式識別,但innodb拒絕包含on delete set default或on update set default子句的表定義。
mysql 外來鍵 del 記錄 MySQL 外來鍵
在mysql中 1 mysql 資料表主要支援六種型別 分別是 bdb heap isam merge myisam innobdb。這六種又分為兩類,一類是 事務安全型 transaction safe 包括bdb和innodb 其餘都屬於第二類,稱為 非事務安全型 non transaction...
mysql外來鍵和外來鍵約束
1.mysql中 鍵 和 索引 的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引 2.如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主...
mysql 外來鍵和外來鍵約束
1.外來鍵 如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。就是a表的主鍵,被用到了b表中,此時它就成了外來鍵 2.外來鍵約束 如果想要插入或者更新外來鍵的值,資料庫會和引用表中字段的資料進行驗證,如果插入或更改的值不在被引用的表中,則插入失敗 外來鍵的作用就是保證...