欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > 数据库 >内容正文

数据库

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

发布时间:2025/6/15 数据库 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

我们通常有这样的需求:删除表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_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。