MYSQL資料庫(六) 外來鍵約束的參照操作

2021-08-02 05:48:41 字數 4234 閱讀 3286

其實可以簡單理解為:在使用外來鍵時候可以參照的依賴關係,例如父類刪除子類也跟著刪除。

mysql> create table sheng(

-> id smallint

unsigned

primary

keyauto_increment,

-> pname varchar(20) not

null

-> );

1、建立外來鍵依賴的時候,我們指定乙個參照,如下(on delete cascade)
mysql> create table city1(

-> id smallint unsigned primary key auto_increment,

-> usename varchar(20) not null,

-> pid smallint unsigned,

-> foreign key(pid) references sheng(id) on delete cascade);//這裡新增了參照cascade

query ok, 0 rows affected (0.17 sec)

2、檢視建立好的資料表city1(show create table city1;)
mysql> show create table city1;

+-------

| table | create table

---------------+

| city1 | create table `city1` (

`id` smallint(5) unsigned not null auto_increment,

`usename` varchar(20) not null,

`pid` smallint(5) unsigned default null,

primary key (`id`),

key `pid` (`pid`),

constraint `city1_ibfk_1` foreign key (`pid`) references `sheng`

(`id`) on del

ete cascade

) engine=innodb default charset=utf8 |

+-------

新增參照成功

3、父列表中插入三條資料,驗證插入是否成功。

這裡注意:如果在兩張表中插入資料,必須先在父表中插入記錄,然後才能在子表中插入資料。原因很簡單,因為子表是參照父表中的資訊,如果父表中不存在這個資訊,自表中也無法參照。

mysql> insert sheng(pname) values(『a』);

query ok, 1 row affected (0.08 sec)

mysql> insert sheng(pname) values(『b』);

query ok, 1 row affected (0.09 sec)

mysql> insert sheng(pname) values(『c』);

query ok, 1 row affected (0.09 sec)

mysql> select * from sheng;

+—-+——-+

| id | pname |

+—-+——-+

| 1 | a |

| 2 | b |

| 3 | c |

+—-+——-+

3 rows in set (0.03 sec)

插入成功,如下圖:

4、在子列表中插入資料,注意插入的時候所參照的id值,父列表中一定要存在

第一次插入成功:

mysql> insert city1(usename,pid) values('tom',3);

query ok, 1 row affected (0.06 sec)

第二次給pid插入乙個父表中不存在的id,這時插入失敗。所以新增外來鍵約束的時候,一定要注意父列表中的參照列是否存在

mysql> insert city1(usename,pid) values('zangsan',7);

error 1452 (23000): cannot add or update a child row: a foreign

key constraint f

ails (`t1`.`city1`, constraint `city1_ibfk_1` foreign key (`pid`)

references `sh

eng` (`id`) on delete cascade)

第三次和第四次插入成功

mysql> insert city1(usename,pid) values('wangwu',1);

query ok, 1 row affected (0.03 sec)

mysql> insert city1(usename,pid) values('wangwu',2);

query ok, 1 row affected (0.06 sec)

----------------------------驗證插入情況----------------------------------

注意:這裡會被問,為什麼id的編號是1、3、4而不是1、2、3 ? 注意我們這裡一共插入了4次,只不過第二次插入的時候我們故意輸入錯誤,雖然插入失敗,但是id的編號2已經被記錄,只不過沒有資料顯示,再輸入的引數id編號就是3。5、進行父列表刪除,檢視子列表是否刪除成功

-------------------------------下面進行刪除------------------------------------

如果我們刪除父列表中的id為3的引數,如圖03,,04。

mysql> delete from sheng where id = 3;

query ok, 1 row affected (0.08 sec)

驗證一下我們父列表中是否刪除成功

mysql> select * from sheng;

+----+-------+

| id | pname |

+----+-------+

| 1 | a |

| 2 | b |

+----+-------+

2 rows in set (0.00 sec)

再驗證一下我們子列表中是否刪除成功

如上圖所示,父列表中id為3的刪除後,子列表中的也會被刪除。這就是上面所說的,給外來鍵約束新增參照後,父列表操作會關聯到子列表一起實現刪除或者更改

MySQL資料庫(五)外來鍵約束

一 foreign key 的作用和要求 找到my.ini檔案,開啟,找到defult stroage engine innodb,檢視引擎是否是innodb,如下圖 案例 一 建立父類表和子類表,資料型別不一致導致150錯誤 mysql create table sheng id smallint...

Mysql資料庫主鍵 外來鍵等約束要點

檢視資料庫 show databases 建立資料庫 create database 資料庫名 刪除資料庫 drop database 資料庫名 單行注釋 注釋內容 多行注釋 內容 數值型 int tinyint微整型 smallint 小整型 小數型別 decimal 總位數,小數字 例 deci...

資料庫(外來鍵及其約束理解)

一 首先是外來鍵的定義 如果乙個欄位x在一張表 表一 中是主關鍵字,而在另外一張表 表二 中不是主關鍵字,則字段x稱為表二的外來鍵 換句話說如果關係模式r1中的某屬性集不是自己的主鍵,而是關係模式r2的主鍵,則該屬性集稱為是關係模式r1的外來鍵。二 主鍵表和外鍵表的理解 1 以公共關鍵字作主鍵的表為...