53 筆記 MySQL學習 外來鍵和引用完整性

2021-08-10 23:03:48 字數 3447 閱讀 6140

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...