53.筆記 mysql學習——外來鍵和引用完整性
利用外來鍵關係,可以再乙個表裡宣告與另乙個表裡的某個索引相關聯的索引。
資料庫會根據關係裡的規則來維護資料引用的完整性。
外來鍵在行的插入操作中很有用,在刪除和更新操作中也有用處。例如:級聯刪除、級聯更新。
外來鍵可以幫我們維護資料的一致性。
在mysql中,innodb引擎提供了對外鍵的支援。
父表:包含原始鍵值的表
子表裡的索引會引用父表裡的索引。子表的索引值必須與父表中的索引值相匹配;或者被設定為null,以表明在父表裡不存在與之對應的行。
innodb儲存引擎關注外來鍵定義如下:
constraint : 為外來鍵約束提供乙個名字
foreign key: 列出子表裡的索引列,列必須與父表裡的索引值相匹配。
references:列出父表及其索引列的名字,讓子表裡的外來鍵可以引用它們
on delete: 指定在刪除父表的行時,子表應該做什麼。(預設,拒絕從父表裡刪除仍被子表的行所引用的那些行)
on update:指定當父表更新時候,子表應該做什麼
子表必須建立索引,且外來鍵列需要放在首位。父表也必須建立索引,且references子句裡的列需要放在首位。
父表和子表索引裡的對應列必須型別相容。
不能對外鍵關係裡的字串列的字首進行索引。
例如如下:
建立表:
mysql> create table parent ( par_id int notnull,primary key(par_id)) engine=innodb;
query ok, 0 rows affected (0.02 sec)
mysql> create table child ( par_id int notnull,child_id int not null,primary key (par_id,child_id),foreign key (par_id)references parent (par_id) on delete cascade on update cascade) engine=innodb;
query ok, 0 rows affected (0.03 sec)
其中on delete cascade和on update cascade表示,父表刪除和更新會級聯到子表。
插入到父表:
mysql> insert into parent (par_id) values(1),(2),(3);
插入到子表:
mysql> insert into child ( par_id,child_id) values(1,1),(1,2);
query ok, 2 rows affected (0.00 sec)
records: 2 duplicates: 0 warnings: 0
mysql> insert into child ( par_id,child_id) values(2,1),(2,2),(2,3);
query ok, 3 rows affected (0.00 sec)
records: 3 duplicates: 0 warnings: 0
mysql> insert into child ( par_id,child_id) values(3,1);
query ok, 1 row affected (0.00 sec)
查詢如下:
mysql> select * from parent;
| par_id |
| 1 |
| 2 |
| 3 |
3 rows in set (0.00 sec)
mysql> select * from child;
| par_id | child_id |
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
6 rows in set (0.00 sec)
在子表中插入乙個在父表不存在的行如下:
mysql> insert into child (par_id,child_id) values(4,1);
error 1452 (23000): cannot add or update achild row: a foreign key constraint fails (`sampdb`.`child`, constraint`child_ibfk_1` foreign key (`par_id`) references `parent` (`par_id`) on deletecascade on update cascade)
出現了報錯。
從父表刪除一行
mysql> delete from parent where par_id=1;
query ok, 1 row affected (0.01 sec)
mysql> select * from parent;
| par_id |
| 2 |
| 3 |
2 rows in set (0.00 sec)
mysql> select * from child;
| par_id | child_id |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
4 rows in set (0.00 sec)
更新父表:
mysql> update parent set par_id=100 wherepar_id=2;
query ok, 1 row affected (0.00 sec)
rows matched: 1 changed: 1 warnings: 0
mysql> select * from parent;
| par_id |
| 3 |
| 100 |
2 rows in set (0.00 sec)
mysql> select * from child;
| par_id | child_id |
| 3 | 1 |
| 100 | 1 |
| 100 | 2 |
| 100 | 3 |
4 rows in set (0.00 sec)
發現子表也會更新
這是因為設定了on update cascade
可以使用show create table語句來檢視表有哪些外來鍵關係。
20 筆記 MySQL學習 InnoDB儲存引擎
20.筆記 mysql學習 innodb儲存引擎 innodb儲存引擎是mysql的預設引擎。有幾項功能 n 其表在執行提交和回滾操作時是事務安全的。n 在系統崩潰後可以自動恢復 n 外來鍵和引用完整性支援,包括級聯刪除和更新 n 基於行級別的鎖定和多版本化 n 從mysql 5.6開始,innod...
MySql學習筆記 索引,外來鍵
索引由資料庫表中一列或多列組合而成,其作用是提高對錶中資料的查詢速度。索引是建立在表上的,是對資料庫表中一列或多列的值進行排序的一種結構。索引可以提高查詢的速度。通過索引,查詢資料時可以不必讀完記錄的所有資訊,而只是查詢索引列。否則,資料庫系統將讀取每條記錄的所有資訊進行匹配。例如,索引相當於新華字...
MySQL學習筆記(11) 外來鍵
foreign key,外面的鍵 鍵不在自己表中 如果a表中有乙個字段 非主鍵 指向b表的主鍵,那麼將該子段稱之為外來鍵。a表被稱為從表,b表被稱為主表。1.建立表的時候增加外來鍵 constraint 外鍵名 foreign key 外來鍵字段 references 主表 主鍵 例項 create...