2012-04-20 66 views
0

我有了這個MySQL表:遞歸更新觸發

CREATE TABLE IF NOT EXISTS `activities` (
`id` INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT, 
`name` CHAR(255) NOT NULL, 
`status` ENUM('open','progress','close'), 
`date_begin` DATE, 
`date_finish` DATE, 
`progress` TINYINT, 
`reliance` INTEGER, 
`parent` INTEGER, 
FOREIGN KEY(owner) REFERENCES users(id) ON UPDATE CASCADE ON DELETE SET NULL, 
FOREIGN KEY(reliance) REFERENCES activities(id) ON UPDATE CASCADE ON DELETE SET NULL, 
FOREIGN KEY(parent) REFERENCES activities(id) ON UPDATE CASCADE ON DELETE SET NULL 
)ENGINE = INNODB; 

我的問題是,當我想更新一個活動的date_begin。事實上,我想更新所有活動的開始日期,這些活動是依賴或更新活動的子項目。 我可以強制mysql創建一個遞歸觸發器嗎?

+0

不,mysql不支持遞歸觸發器 – 2012-04-20 11:14:31

回答

0

像這樣的事情應該工作,至少如果你在最近的MySQL版本:

delimiter | 

CREATE TRIGGER activitiesUpdateReliantAndChildren BEFORE UPDATE ON 'activities' 
FOR EACH ROW 
BEGIN 

update 'activities' 
set date_begin = NEW.date_begin 
where reliance = NEW.id; 

update 'activities' 
set date_begin = NEW.date_begin 
where parent = NEW.id; 

END; 
| 

delimiter ; 
+0

但這是一個遞歸觸發器。我有這個錯誤[代碼]無法更新表'mytable'在存儲的函數/觸發器,因爲它已經被調用此存儲的函數/觸發器的語句使用... – Lic 2012-04-24 09:52:21

+0

對不起,應該是之前更新 - 編輯我的答案。 Before應該仍然可以訪問NEW metaDB,並且不應該導致遞歸。 – 2012-04-24 17:14:40

1

雖然觸發可能工作......這不是一個好的做法創建遞歸觸發器!如果你必須......那麼在申請之前不僅要考慮兩次,還要考慮100次!有時他們可能會導致更多的傷害。