0

是否可以在 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'

上述两个触发器单独工作,但在一起时不起作用。请提供任何帮助,在此先感谢。

4

2 回答 2

2

如果我从您的评论中正确理解,您需要某种默认表,您将在触发器中使用这些默认表,并且管理员可以更改其中的值。

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演示

于 2013-09-01T00:54:57.693 回答
0

同一操作不能有多个触发器。但是您可以在 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。

一个触发器导致另一个触发器,并且认为可能很快变得混乱。触发器很难调试,尤其是当它们相互触发时。在为数据库编写触发器和过程时,请确保您知道自己在做什么。

于 2013-08-30T22:07:57.023 回答