2012-04-20 61 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次!有时他们可能会导致更多的伤害。