文档章节

MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除

喵王不瞌睡
 喵王不瞌睡
发布于 2015/06/08 10:07
字数 562
阅读 1288
收藏 0

我们通常有这样的需求:删除表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,用来标记触发器开始与结束


本文转载自:http://www.phpman.com.cn/archives/345

喵王不瞌睡
粉丝 11
博文 168
码字总数 51103
作品 0
浦东
个人站长
私信 提问
补12.关于mysql的外键约束

一、什么是mysql中的外键(froeign key) 假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign key)。 在子表中增加一条记录时,需要确定是否有与父表相...

苏浩智
2017/06/06
0
0
Oracle专题16之触发器

1、触发器的概述 a、触发器是什么? 触发器是指存放在数据库中,并且被隐含执行的存储过程。 当发生特定事件时,Oracle会自动执行触发器的相应代码。 b、触发器的类型 DML触发器;DDL触发器;...

极客微信条
2017/12/22
0
0
浅谈数据库约束

国有国法 家有家规 其实很多时候技术和生活息息相关,怎样的需求就会有出来解决方案 数据库也是那么一个神奇的东西,毕竟是关系型数据库,数据独立而又可以表表关联,有时候就需要约束,在某些...

长路慢
2018/01/04
0
0
PostgreSQL ALTER TABLE(ZH)

Name ALTER TABLE -- 修改表的定义 Synopsis ALTER TABLE [ ONLY ] name [ * ] action [ , ... ] ALTER TABLE [ ONLY ] name [ * ] RENAME [ COLUMN ] column TO new_column ALTER TABLE nam......

长平狐
2012/09/06
120
0
PostgreSQL ALTER TABLE(ZH)

Name ALTER TABLE -- 修改表的定义 Synopsis ALTER TABLE [ ONLY ] name [ * ] action [ , ... ] ALTER TABLE [ ONLY ] name [ * ] RENAME [ COLUMN ] column TO new_column ALTER TABLE nam......

长平狐
2012/08/27
199
0

没有更多内容

加载失败,请刷新页面

加载更多

相册管理

相册管理 相册管理 一、相册管理:指对所有上传的图片的归类管理。 1、创建相册:可以新建多个相册。 2、上传图片:可以上传图片到相册里。 3、搜索:输入相册名称对相册的搜索。 二、点击相...

Geek-Chic
40分钟前
6
0
pymongo和mongoengine安装和使用教程 包含常用命令行和代码示例

本文首发于个人博客https://kezunlin.me/post/e88f04e5/,欢迎阅读最新内容! pymongo and mongoengine tutorial on ubuntu 16.04 Guide version mongo 2.6.10 mongo gui: robo3t-1.3.1 pymo......

kezunlin
今天
9
0
潜水一周,我精心整理了两个超级有用的职场生存之道

最近一周过的很充实,所以都没爬上来和大家 好好聊聊,原本计划的很多事情也没有下文,因为略忙,有点不可开交。需求和线上的问题常常困扰了我,或许这就是还需要提升的关键吧。 但是,好在还...

Dimple91
今天
6
0
大规模机器集群-故障自动处理(二)

本篇开始介绍具体的实现过程,为表述方便,先定义一些名词, _AutoRepairSystem: _故障自动维修系统, 缩写为ARS 原子操作:任务的最小操作,机器任务通常是指重启、重装 运维人员:运维工程师...

曲行人
今天
6
0
使用Supervisor管理任务

安装:yum install supervisor 修改配置文件:vi /etc/supervisord.conf [unix_http_server]file=/var/run/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用;chmod=0700 ......

FalconChen
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部