首页 > 数据库技术 > 详细

mysql---级联更新和删除操作

时间:2015-11-22 15:40:12      阅读:331      评论:0      收藏:0      [点我收藏+]

我们通常有这样的需求:删除表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; #错误,从表中有相关引用,因此主表中无法修改

由此可见,这三者都会插入操作进行相同的约束,不同反映在处理删除和更新操作;

 

mysql---级联更新和删除操作

原文:http://www.cnblogs.com/shilin000/p/4985816.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!