![](/img/trans.png)
[英]Can a MySQL trigger be associated to more than one table or by all tables?
[英]More than one trigger on a table in mysql
是否可以在mysql中的同一个表上创建多个触发器? 如果可能的话,我想在同一个表上创建两个触发器。下面是我尝试过的但是它不起作用。
标记为table1的表上的第一个触发器,
Create trigger update_table BEFORE INSERT ON table1
FOR EACH ROW SET NEW.Academic_Year='2010'
标记为table1的表上的第二个触发器,
Create trigger update_table BEFORE INSERT ON table1
FOR EACH ROW SET NEW.Fees='20.00'
以上两个触发器分开工作但在它们在一起时不起作用。请提前感谢任何帮助。
如果我从您的评论中正确理解,您需要某种默认表,您将在触发器中使用这些默认表,并且值可由管理员更改。
defaults
表模式可能看起来像
CREATE TABLE defaults
(`id` int not null auto_increment primary key,
`fees` decimal(12, 2) not null default 0,
`academic_year` int not null default 0,
`created` datetime not null
)
这个想法是存储所有默认值以及生效时的时间戳。 要更改默认值,只需插入具有新默认值的新行。
INSERT INTO Defaults (`fees`, `academic_year`, `created`)
VALUES (25.00, 2011, NOW())
现在是触发器
DELIMITER $$
CREATE TRIGGER tg_bi_table1
BEFORE INSERT ON Table1
FOR EACH ROW
BEGIN
DECLARE _fees DECIMAL(12, 2);
DECLARE _year INT;
SELECT fees, academic_year
INTO _fees, _year
FROM defaults
ORDER BY id DESC
LIMIT 1;
SET NEW.fees = _fees,
NEW.academic_year = _year;
END$$
DELIMITER ;
这是SQLFiddle演示
您不能为同一操作设置多个触发器。 但是你可以在Begin和end之间包装所有内容:
DELIMITER $$
Create trigger update_table BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
SET NEW.Academic_Year='2010';
SET NEW.Fees='20.00';
END $$
请注意你必须使用DELIMITER。
一个触发器导致另一个触发器并且认为可能快速变得混乱。 触发器很难调试,尤其是当它们相互触发时。 在为数据库编写触发器和过程时,请确保知道自己在做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.