我們通常有這樣的需求:刪除表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...