MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除
我們通常有這樣的需求:刪除表Table 1中記錄,需要同時(shí)刪除其它表中與Table 1有關(guān)的若干記錄。
舉個(gè)例子:
現(xiàn)有2個(gè)實(shí)體- 麻將機(jī) 學(xué)生、課程,1種聯(lián)系- 成績
分別創(chuàng)建 學(xué)生表 students, 課程表course,成績表score
--創(chuàng)建 學(xué)生表 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");
?
--創(chuàng)建課程表
CREATE TABLE IF NOT EXISTS `course` (
?`id` int(11) NOT NULL AUTO_INCREMENT,
?`name` varchar(32) DEFAULT "",
?PRIMARY KEY (`id`)
) ENGINE=InnoDB;
?
-- 插入數(shù)據(jù)若干
INSERT INTO `course` (`id`, `name`) VALUES
(1, "english"),
(2, "chinese"),
(3, "math");
?
--創(chuàng)建成績表
--sid 學(xué)生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;
?
--插入若干數(shù)據(jù)
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);
現(xiàn)在,我希望:
刪除students表記錄的同時(shí),自動(dòng)刪除成績表中該同學(xué)的記錄
刪除course表記錄的同時(shí),自動(dòng)刪除成績表中該課程的記錄
我想到的做法有二:
一,使用innodb表的外鍵約束
ALTER TABLE `score`
ADD CONSTRAINT `student_ibfk1`
FOREIGN KEY `sid`(`sid`) REFERENCES `students` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE;
這里CASCADE作用就是在父表記錄更新或刪除時(shí),子表更新或刪除相應(yīng)的記錄
外鍵約束的動(dòng)作除了CASCADE,還有RESTRICT(限制刪除)SET NULL(設(shè)為空值,字段如果允許為空的話)等
外鍵約束文檔詳見:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
二,使用觸發(fā)器trigger進(jìn)行操作
由于外鍵約束只能用于Innodb型表,因些對于MyIsam型表還得用trigger來進(jìn)行更新
--以下觸發(fā)器在刪除students后同時(shí)刪除表score中相關(guān)記錄
DROP TRIGGER IF EXISTS `deleteScore`//
CREATE TRIGGER `deleteScore` AFTER DELETE ON `students`
?FOR EACH ROW BEGIN
DELETE FROM score WHERE sid=OLD.`id`;
END
//
觸發(fā)器比較好理解,其中AFTER是事件發(fā)生后,有的需求可能用BEFORE;事件類型有INSERT,REPLACE,UPDATE,DELETE等
這里的”//”是delimiter,用來標(biāo)記觸發(fā)器開始與結(jié)束
總結(jié)
以上是生活随笔為你收集整理的MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专为设计师而写的GitHub快速入门教程
- 下一篇: MySql级联删除和更新