咱们一般有这样的需求:删除表Table 1中记录,须要同时删除其它表中与Table 1有关的若干记录。html
举个例子:mysql
现有2个实体- 麻将机 学生、课程,1种联系- 成绩sql
分别建立 学生表 students, 课程表course,成绩表scorespa
--建立 学生表 studentshtm
CREATE TABLE IF NOT EXISTS `students` (事件
`id` int(11) NOT NULL AUTO_INCREMENT,ci
`name` varchar(32) DEFAULT "",文档
PRIMARY KEY (`id`)it
) ENGINE=InnoDB;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,用来标记触发器开始与结束