zoukankan      html  css  js  c++  java
  • mysql---级联更新和删除操作

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

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

  • 相关阅读:
    Java程序,猜大小游戏
    Java程序,取随机数的两种实现方法
    用Java程序判断是否是闰年
    Python学习-基础篇17 Django-进阶
    Python学习-基础篇16 Django-Ajax、Cookie
    Python学习-基础篇15 Django-MTV
    Python学习-基础篇14 Web框架本质及第一个Django实例
    Python学习-基础篇13 前端知识之Bootstrap框架
    Python学习-基础篇12 前端知识之Javascript知识
    Python学习-基础篇11 前端知识之HTML内容
  • 原文地址:https://www.cnblogs.com/shilin000/p/4985816.html
Copyright © 2011-2022 走看看