2013-08-30 14 views
0

是否可以在mysql的同一个表上创建多个触发器? 如果可能,我想在同一张桌子上创建两个触发器。以下是我尝试过的,但不起作用。mysql中的表中有多个触发器

表上标记表1第一次触发,

Create trigger update_table BEFORE INSERT ON table1 
FOR EACH ROW SET NEW.Academic_Year='2010' 

表上标记表1二触发,

Create trigger update_table BEFORE INSERT ON table1 
FOR EACH ROW SET NEW.Fees='20.00' 

上面的两个触发器分开工作,但不工作的时候都together.Please任何帮助感谢,预先感谢。

+0

为什么不将它们组合成一个触发?虽然我会说在大多数情况下你应该避免触发器。 –

+0

@George你能否详细说明你实际想要达到的目标?你不能调用触发器本身。无论您如何通过客户端代码从您的一个php页面,或通过mysql客户端或其他触发器进行插入,它们都被MySql在其中一个事件中调用(在插入之前)。 – peterm

+0

感谢您的时间。我实际上希望'table1'中的每一行在插入表格后自动拥有'费用'数据,因此'20 .00'和'Academic_Year'数据因此'2010'。 Academic_Year和费用数据是从不同的页面由用户设置。希望这是明确的。谢谢 – George

回答

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

+0

您好,请与我们聊聊,您能否安排我们谈话的时间...请真的很重要。谢谢 – George

0

对于相同的操作,您不能有多个触发器。但是你可以在开始和结束之间打包所有内容:

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。

一个触发器导致另一个触发器,并认为可能很快变得混乱。触发器很难调试,特别是当它们互相触发时。只要确定你知道你在为你的数据库写入触发器和程序时做了什么。

+0

是的,谢谢,但我想实际上在PHP中调用两个不同页面的触发器,这就是为什么我想创建两个触发器从两个不同的页面。谢谢。 – George

+0

您希望数据库如何从哪个站点发现插入语句?你不能这样做。触发器在执行操作期间触发(在完成插入语句之前的情况下)。即使你有两个分离的触发器,它们也会在同一时间被触发。也许你应该使用程序或功能? – takwlasnie

+0

请在上面阅读我的评论。感谢 – George