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

时间: 2024-08-27 17:37:57

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

MySQL数据库授权的两种方式

MySQL数据库授权的两种方式 方法一:通过grant命令创建用户并授权 grant命令简单语法如下: grant all privileges on dbname.* to [email protected] identified by 'passwd'; 列表说明如下: 说明:上述命令是授权localhost主机上通过用户username管理dbname数据库的所有权限,密码是passwd.其中,username,dbname,passwd可根据业务的情况修改. 举例:创建zd用户,对tes

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

对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍:   创建用例表: create table test1(id number(10),name varchar2(20)); create table test2(id number(10),name varchar2(20));   测试数据: begin insert into test1 values(1,'A'

MySql查询生日的两种方式

需要是要查询日期段内过生日的会员,分为两种情况: 1. 不跨年 例如: 查询2017-01-01到2017-01-20之间过生日的会员  (假定今天是2017-01-01则这种也可以描述为20天内过生日的会员) select * from user where DATE_FORMAT(birthday,'%m-%d') between '01-01' and '01-20' 2. 跨年 例如: 查询2017-12-27到2018-01-05之间过生日的会员, (假定今天是2017-12-27则这

网络协议 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次. >强烈依赖数据库的驱动jar 解决办法: Class.forName("com.mysql.jdbc.Driver"); 1.1.2 API详解:java.sql.Statement接口: 操作sql语句,并返回相应结果 String sql = "某SQL语句&qu

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

转载自:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具

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

不停止 MySQL 服务增加从库的两种方式 提交 我的评论 加载中 已评论 不停止 MySQL 服务增加从库的两种方式 2015-07-12 数据库开发 数据库开发 数据库开发 微信号 DBDevs 功能介绍 分享数据库相关技术文章.教程和工具,另外还包括数据库相关的工作.偶尔也谈谈程序员人生 :) (点击上方蓝字,快速关注我们) 作者:李振良 网址:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业

不停止MySQL服务增加从库的两种方式【转载】

现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. 一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快,不锁表.为什么不锁表?因为自身会监控主库日

21_django配置使用mysql数据库的两种方式

目录 配置django项目使用mysql数据库的两种方式 1. 直接在settings.py 文件中添加数据库配置信息 2. 将数据库配置信息存到一个文件中,在settings.py文件中将其引入.(推荐) 安装mysql驱动 1. 使用mysqlclient *推荐 2. 使用pymysql django2.2以上版本默认不支持使用了 配置django项目使用mysql数据库的两种方式 1. 直接在settings.py 文件中添加数据库配置信息 # 配置数据库的第一种方式 DATABASES

关于Mysql删除表数据的两种方式对比

1.delete from table_name 一行一行删除,只删除表数据,auto_increament仍停留在最后一天数据的下一个值. 2.truncate table_name 快捷删除表数据.先删除整个表,然后重新建表结构.auto_increament从1开始. 关于Mysql删除表数据的两种方式对比,布布扣,bubuko.com