咱們一般有這樣的需求:刪除表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,用來標記觸發器開始與結束