mysql 利用外來鍵級聯刪除 更新

2021-08-10 19:16:17 字數 4760 閱讀 1903

mysql 利用外來鍵級聯刪除、更新

mysql支援外來鍵的儲存引擎只有innodb

在建立外來鍵的時候,要求父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引。

在建立子表索引的時候,可以指定在刪除、更新父表時,對子表進行相應的操作,包括

restrict

no action

set null

cascade.

其中restrict 和 no action 相同:在子表有關聯記錄的情況下父表不能更新;

cascade:父表在跟新或者刪除時,更新或者刪除子表對應的記錄;

set null:表示父表在更新或者刪除的時候,子表對應的字段被set null.

建立資料庫:

create databvase test;
建立兩個表,其中第乙個表的「id」是第二個表(userinfo)的外來鍵:

create

table

`user` (

`id`

int(4) not

null,

`***` enum('f','m') default

null,

primary

key (`id`)

) engine=innodb default charset=utf8;

create

table

`userinfo`(

`sn`

int(4) not

null auto_increment,

`userid`

int(4) not

null,

`info`

varchar(20) default

null,

primary

key(`sn`),

key`userid`(`userid`),

constraint

`userinfo_ibfk_1`

foreign

key(`userid`)references

`user`(`id`)

ondelete

cascade

onupdate

cascade

)engine=innodb default charset=utf8;

注意:

儲存引擎必須使用inndb引擎;

外來鍵必須建立索引;

外來鍵繫結關係這裡使用了「on delete cascade」」on update cascade」,意思是如果外來鍵對應資料被刪除或者跟新時,將關聯資料完全刪除或者相應地更新。更過資訊請參考mysql手冊中關於innodb的文件;

插入資料:

insert

into

`user` (`id`,`***`) values ('1', 'f'), ('2', 'm'), ('3', 'f');

insert

into

`userinfo` (`sn`,`userid`,`info`)

values ('1', '1', '2005054dsf'),

('3', '1', 'gdsgergergrtre'),

('4', '2', 'et34t5435435werwe'),

('6', '2', 'ret345tr4345'),

('8', '3', '45r2343234were'),

('9', '3', 'wfyhtyjtyjyjy');

我們先來看一下當前資料表的狀態:

mysql> show tables;

+——————+

| tables_in_runoob |

+——————+

| runoob_tbl |

| user |

| userinfo |

+——————+

3 rows in set (0.00 sec)

user表中的資料:

mysql> select * from user;

+—-+——+

| id | *** |

+—-+——+

| 1 | f |

| 2 | m |

| 3 | f |

+—-+——+

3 rows in set (0.00 sec)

userinfo表中的資料:

mysql> select * from userinfo;

+—-+——–+——————-+

| sn | userid | info |

+—-+——–+——————-+

| 1 | 1 | 2005054dsf |

| 2 | 1 | fdsfewfdsfds |

| 3 | 1 | gdsgergergrtre |

| 4 | 2 | et34t5435435werwe |

| 5 | 2 | 435rtgtrhfghfg |

| 6 | 2 | ret345tr4345 |

| 7 | 3 | fgbdfvbcbfdgr |

| 8 | 3 | 45r2343234were |

| 9 | 3 | wfyhtyjtyjyjy |

+—-+——–+——————-+

9 rows in set (0.00 sec)

對於建立以上不表,相信對大家也沒什麼難度了。好的,下面我們就要試驗我們的級聯刪除功能了。

我們將刪除user表中id為2的資料記錄,看看userinf表中userid為2的相關子紀錄是否會自動刪除:

mysql> delete fromuserwhereid=2;

query ok, 1 row affected (0.04 sec)

執行刪除操作成功!

mysql> select * from user;

+—-+——+

| id | *** |

+—-+——+

| 1 | f |

| 3 | f |

+—-+——+

2 rows in set (0.00 sec)

看user表中已經沒有id為2的資料記錄了!

mysql> select * from userinfo;

+—-+——–+—————-+

| sn | userid | info |

+—-+——–+—————-+

| 1 | 1 | 2005054dsf |

| 2 | 1 | fdsfewfdsfds |

| 3 | 1 | gdsgergergrtre |

| 7 | 3 | fgbdfvbcbfdgr |

| 8 | 3 | 45r2343234were |

| 9 | 3 | wfyhtyjtyjyjy |

+—-+——–+—————-+

6 rows in set (0.00 sec)

看,userinfo表中已經沒有userid為2的3條資料記錄了!

更新的操作也類似,因為我們在前面建表的時候已經定義外來鍵刪除、更新操作都是cascade,所以在這裡可以直接測試資料。

將user表中原來id為1的資料記錄更改為id為4,執行如下:

mysql> update user set id=4 where id=1;

query ok, 1 row affected (0.03 sec)

rows matched: 1 changed: 1 warnings: 0

現在去看看兩個表中是資料是否發生了變化:

mysql> select * from user;

+—-+——+

| id | *** |

+—-+——+

| 3 | f |

| 4 | f |

+—-+——+

2 rows in set (0.00 sec)

mysql> select * from userinfo;

+—-+——–+—————-+

| sn | userid | info |

+—-+——–+—————-+

| 1 | 4 | 2005054dsf |

| 2 | 4 | fdsfewfdsfds |

| 3 | 4 | gdsgergergrtre |

| 7 | 3 | fgbdfvbcbfdgr |

| 8 | 3 | 45r2343234were |

| 9 | 3 | wfyhtyjtyjyjy |

+—-+——–+—————-+

6 rows in set (0.00 sec)

比較原來的表可以發現它們的確已經更新成功了,測試完成!!!這也就實現了用外來鍵對多個相關聯的表做同時刪除、更新的操作,從而保證了資料的一致性。

mysql外來鍵級聯更新刪除

mysql支援外來鍵的儲存引擎只有innodb,在建立外來鍵的時候,要求父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引。在建立索引的時候,可以指定在刪除 更新父表時,對子表進行的相應操作,包括restrict no action set null和cascade。其中restri...

MySQL中利用外來鍵實現級聯刪除 更新

mysql支援外來鍵的儲存引擎只有innodb,在建立外來鍵的時候,要求父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引 在建立索引的時候,可以指定在刪除 更新父表時,對子表進行的相應操作,包括restrict no action set null和cascade。其中restri...

SQLite 外來鍵 級聯更新 刪除

自身關聯 create table business id varchar 50 not null primary key,name varchar 200 not null,parent id varchar 50 configurationpage boolean not null,foreig...