文档章节

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

喵王不瞌睡
 喵王不瞌睡
发布于 2015/06/08 10:07
字数 562
阅读 1102
收藏 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
码字总数 51104
作品 0
浦东
个人站长
补12.关于mysql的外键约束

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

苏浩智
2017/06/06
0
0
浅谈数据库约束

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

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

Name ALTER TABLE -- 修改表的定义 Synopsis ALTERTABLE[ ONLY ] name[ * ] action [, ... ]ALTERTABLE[ ONLY ] name[ * ] RENAME [ COLUMN ]columnTO new_columnALTERTABLE name RENAME TO ......

长平狐
2012/09/06
110
0
Oracle专题16之触发器

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

极客微信条
2017/12/22
0
0
PostgreSQL ALTER TABLE(ZH)

Name ALTER TABLE -- 修改表的定义 Synopsis ALTERTABLE[ ONLY ] name[ * ] action [, ... ]ALTERTABLE[ ONLY ] name[ * ] RENAME [ COLUMN ]columnTO new_columnALTERTABLE name RENAME TO ......

长平狐
2012/08/27
185
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么 vue 默认导出的是 vue.common.js,它和 vue.js 的区别在哪里,又有什么关系?

这个问题在囧克斯的博客中有提到。 Vue 最早会打包生成三个文件,一个是 runtime only 的文件 vue.common.js,一个是 compiler only 的文件 compiler.js,一个是 runtime + compiler 的文件 ...

粒子数反转
21分钟前
1
0
php正则表达式替换图片地址

<?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性<......

mdoo
24分钟前
0
0
一个简单的系统监控脚本

一个简单的系统信息监控脚本 #!/bin/bash# DATE:20181018# System monitor by Kxvzinterval=5while :doecho '==========================================================...

Kxvz
27分钟前
1
0
七牛云助你度寒冬 | 每天 10:24, 新用户抢全额免单

近年来,中美贸易战、股市暴跌、房地产变天、人民币贬值等等,企业艰难生存于冰川夹缝之中,融资发展难上加难。 凛冬将至, 七牛云特此推出免单好礼,为新用户(2018 年 10 月 10 日后新注册...

七牛云
28分钟前
0
0
Echarts X轴刻度标签换行显示

xAxis: [ { 'type':'category', splitLine: {show: false}, axisLabel: { show: true,//是否显示 interval:0,//强制显示 ......

郭周园
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部