mysql級聯更新的兩種方式:觸發器更新和外鍵


1.mysql級聯更新有兩種方式:觸發器更新和外鍵更新.

2.觸發器更新和外鍵更新的目的都是為了保證數據完整性。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM