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,用来标记触发器开始与结束

mysql级联更新的两种方式:触发器更新和外键的更多相关文章

  1. mysql批量更新的两种方式效率试验<二>

    Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...

  2. mysql复制表的两种方式

    mysql复制表的两种方式. 第一.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 或者 create table 新表 like 旧表 第二 ...

  3. Oracle并行更新的两种方式(merge/update内联视图)

    对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:   创建用例表: ...

  4. linux中mysql密码找回的两种方式

    方法一:修改my.cnf配置文件 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的  ...

  5. MySql查询生日的两种方式

    需要是要查询日期段内过生日的会员,分为两种情况: 1. 不跨年 例如: 查询2017-01-01到2017-01-20之间过生日的会员  (假定今天是2017-01-01则这种也可以描述为20天内过生 ...

  6. MySQL数据库授权的两种方式

    方法一:grant命令创建用户并授权(针对只修改权限) grant命令简单语法如下: grant all privileges on dbname.* to username@localhost id ...

  7. Mysql 调用存储过程的两种方式

    一,使用call语句: 如:创建 call 调用: 使用占位符,通过prepare,execute调用:

  8. 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

    1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...

  9. 不停止MySQL服务增加从库的两种方式

    不停止MySQL服务增加从库的两种方式 转载自:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业务量访 ...

随机推荐

  1. 基于lnmp.org的xdebug安装

    1. 下载xdebug wget http://xdebug.org/files/xdebug-2.3.3.tgz 2. 创建一个目录: mkdir ./xdebug 3. 复制xdebug包到xde ...

  2. WCF全面解析第二章 地址(Adress)

    2.1 统一资源标识(URL) 2.1.1 Http/Https 2.1.2 Net.TCP 2.1.3 Net.Pipe WCF只将命名管道专门用于同一台机器的跨进程通信. 2.1.4 Net.Ms ...

  3. C# 实例化接口对象

    在head first 设计模式中 用到了很多很多接口对象 首先澄清一个问题,就是接口不仅可以声明对象,而且可以把对象实例化,还可以当做参数被传入. 一.接口回调 这就是继承中的向上转型.父类 FL= ...

  4. QUOTENAME函数的用法

    quotename函数的语法为:quotename('expression1','expression2') expression1:指的是需要被特殊处理的字符 expression2:例如{}.[] ...

  5. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  6. iPad横屏模式研究

    在iPad应用开发时如何让设备只支持横屏(landscape)模式,我做了多次尝试,并没有发现比较简捷的设置方法.我尝试了大概大概3种方式. 1.通过XCode设置“iPad Deployment i ...

  7. 关于qt5在win7下发布 & 打包

    QT5 发布时,莫过于依赖动态链接库(dll) , 但是,QT5的动态链接库貌似都有2套 ,例如 Qt5Core (针对realese) , Qt5Cored (针对debug) ,凡事末尾带d的都是 ...

  8. mysql 的数据文件

    mysql的数据文件 由于mysql的数据文件结构主要跟mysql的存储引擎相关,这里不做过多解释,具体查看各个引擎章节的内容 .首先上一段小辉老师的教程; 在MySQL 中每一个数据库都会在定义好( ...

  9. ffmpeg mp3转ogg的命令

    ffmpeg.exe -y -i bb.mp3 -acodec libvorbis -ab 128k bb.ogg

  10. ORA-01031:insufficient privileges

    描述:oracle11g用scott用户在plsql上以sysdba身份登录显示以上错误,可是在cmd面板中却正常,网上各种找答案不没有对症,最后这位网友的回答解决了我的问题. 原帖网址:http:/ ...