mysql 級聯更新和刪除操作

2022-08-04 09:54:12 字數 3451 閱讀 9690

我們通常有這樣的需求:刪除表table 1中記錄,需要同時刪除其它表中與table 1有關的若干記錄。

對於這種,我們有兩種解決方法:

一,使用innodb表的外來鍵約束

alter table `score`

add constraint `student_ibfk1`

foreign key `sid`(`sid`) references `students` (`id`)

on delete cascade on update cascade;

這裡cascade作用就是在父表記錄更新或刪除時,子表更新或刪除相應的記錄

外來鍵約束的動作除了cascade,還有restrict(限制刪除)set null(設為空值,字段如果允許為空的話)等

二,使用觸發器trigger進行操作

由於外來鍵約束只能用於innodb型表,因些對於myisam型表還得用trigger來進行更新

--以下觸發器在刪除students後同時刪除表score中相關記錄

drop trigger if exists `deletescore`

create trigger `deletescore` after delete on `students`

for each row begin

delete from score where sid=old.`id`;

end觸發器比較好理解,其中after是事件發生後,有的需求可能用before;事件型別有insert,replace,update,delete等;

對於mysql外來鍵約束,再說幾句:

外來鍵約束分為三種:cascade,set null,restrict

舉例子來說明差異:

首先建立使用者組表:

建立使用者組表

create table t_group (

id int not null,

name varchar(30),

primary key (id)

並插入兩條記錄:

插入記錄

insert into t_group values (1, 'group1');

insert into t_group values (2, 'group2');

下面建立使用者表,分別以不同的約束方式建立外來鍵引用關係:

1、級聯(cascade)方式

級聯方式

create table t_user (

id int not null,

name varchar(30),

groupid int,

primary key (id),

foreign key (groupid) references t_group(id) on delete cascade on update cascade

參照完整性測試

insert into t_user values (1, 'qianxin', 1); #可以插入

insert into t_user values (2, 'yiyu', 2); #可以插入

insert into t_user values (3, 'dai', 3); #錯誤,無法插入,使用者組3不存在,與參照完整性約束不符

約束方式測試

insert into t_user values (1, 'qianxin', 1);

insert into t_user values (2, 'yiyu', 2);

insert into t_user values (3, 'dai', 2);

delete from t_group where id=2; #導致t_user中的2、3記錄級聯刪除

update t_group set id=2 where id=1; #導致t_user中的1記錄的groupid級聯修改為2

2、置空(set null)方式

置空方式

create table t_user (

id int not null,

name varchar(30),

groupid int,

primary key (id),

foreign key (groupid) references t_group(id) on delete set null on update set null

參照完整性測試insert into t_user values (1, 'qianxin', 1); #可以插入

insert into t_user values (2, 'yiyu', 2); #可以插入

insert into t_user values (3, 'dai', 3); #錯誤,無法插入,使用者組3不存在,與參照完整性約束不符

約束方式測試

insert into t_user values (1, 'qianxin', 1);

insert into t_user values (2, 'yiyu', 2);

insert into t_user values (3, 'dai', 2);

delete from t_group where id=2; #導致t_user中的2、3記錄的groupid被設定為null

update t_group set id=2 where id=1; #導致t_user中的1記錄的groupid被設定為null

3、禁止(no action / restrict)方式

禁止方式

create table t_user (

id int not null,

name varchar(30),

groupid int,

primary key (id),

foreign key (groupid) references t_group(id) on delete no action on update no action

參照完整性測試

insert into t_user values (1, 'qianxin', 1); #可以插入

insert into t_user values (2, 'yiyu', 2); #可以插入

insert into t_user values (3, 'dai', 3); #錯誤,無法插入,使用者組3不存在,與參照完整性約束不符

約束方式測試

insert into t_user values (1, 'qianxin', 1);

insert into t_user values (2, 'yiyu', 2);

insert into t_user values (3, 'dai', 2);

delete from t_group where id=2; #錯誤,從表中有相關引用,因此主表中無法刪除

update t_group set id=2 where id=1; #錯誤,從表中有相關引用,因此主表中無法修改

由此可見,這三者都會插入操作進行相同的約束,不同反映在處理刪除和更新操作;

SQL級聯更新和級聯刪除

alter table 表名 add constraint 約束名 foreign key 欄位名 references 主表名 欄位名 on delete cascade 語法 foreign key column n references referenced table name ref co...

MySQL更新和刪除

更新和刪除的操作sql語句比較簡單,不過要注意使用update的時候,要注意weher條件的限制,下面的語句是只更新id為10005的email位址,如果不加where語句限制,那麼將表中所有的email更新為 elmer fudd.com 刪除某個列的值,設定為null即可。刪除行的sql語句,使...

資料庫級聯更新和刪除

如果a id,name 表為主表。b id,a id,name 表為從表,b.a id外來鍵關聯到a id。那麼如果需要更新a.id或者刪除a的資料,且在b表中有資料關聯到需要更新或者刪除的a表紀錄,那麼普通的更新必然會有外來鍵衝突。解決方法如下 mysql 在b表中建立delete cascade...