• mysql级联更新的两种方式:触发器更新和外键


    1.mysql级联更新有两种方式:触发器更新和外键更新.

    2.触发器更新和外键更新的目的都是为了保证数据完整性。

    我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1有关的若干记录。

    举个例子:

    现有2个实体- 麻将机 学生、课程,1种联系- 成绩

    分别创建 学生表 students, 课程表course,成绩表score

    --创建 学生表 students

    CREATE TABLE IF NOT EXISTS `students` (

     `id` int(11) NOT NULL AUTO_INCREMENT,

     `name` varchar(32) DEFAULT "",

     PRIMARY KEY (`id`)

    ) ENGINE=InnoDB;

    --插入若干记录

    INSERT INTO `students` (`id`, `name`) VALUES

    (1, "john"),

    (2, "lucy"),

    (4, "jack");

    --创建课程表

    CREATE TABLE IF NOT EXISTS `course` (

     `id` int(11) NOT NULL AUTO_INCREMENT,

     `name` varchar(32) DEFAULT "",

     PRIMARY KEY (`id`)

    ) ENGINE=InnoDB;

    -- 插入数据若干

    INSERT INTO `course` (`id`, `name`) VALUES

    (1, "english"),

    (2, "chinese"),

    (3, "math");

    --创建成绩表

    --sid 学生id

    --cid 课程id

    CREATE TABLE IF NOT EXISTS `score` (

     `sid` int(11) DEFAULT "0",

     `cid` int(11) DEFAULT "0",

     `score` float(6,2) DEFAULT "0.00",

     KEY `sid` (`sid`),

     KEY `cid` (`cid`)

    ) ENGINE=InnoDB;

    --插入若干数据

    INSERT INTO `score` (`sid`, `cid`, `score`) VALUES

    (1, 2, 95.00),

    (1, 3, 65.00),

    (2, 1, 77.00),

    (2, 2, 68.50),

    (2, 3, 89.00);

    现在,我希望:

    删除students表记录的同时,自动删除成绩表中该同学的记录

    删除course表记录的同时,自动删除成绩表中该课程的记录

    我想到的做法有二:

    一,使用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(设为空值,字段如果允许为空的话)等

    外键约束文档详见:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

    二,使用触发器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等

    这里的”//”是delimiter,用来标记触发器开始与结束

  • 相关阅读:
    杜教筛
    GCD Counting Codeforces
    洛谷 P4317 花神的数论题 || bzoj3209
    About set HDU
    Queue Sequence HDU
    bzoj2154||洛谷P1829 Crash的数字表格&&JZPTAB && bzoj3309 DZY Loves Math
    洛谷 P1445 [Violet]樱花
    洛谷 P2158 [SDOI2008]仪仗队 && 洛谷 P1447 [NOI2010]能量采集
    nginx中使用waf防火墙
    wordpress安装
  • 原文地址:https://www.cnblogs.com/panxuejun/p/5975741.html
Copyright © 2020-2023  润新知