mysql触发器不再正常工作

时间:2013-08-01 16:30:22

标签: mysql sql triggers

我的触发器突然停止工作。它工作正常,现在只有一半的工作。触发器连接了我为其编写的特定列,但现在对于其中一列(自动增量PK),它只是将该列输出为零,但其他一切都很好。

create trigger insert_trigger
before insert on bids
for each row
set new.opportunity = concat(new.dueDate," - ",new.serialNumber," - ",new.organization," - ",new.description);

create trigger update_trigger
before update on bids
for each row
set new.opportunity = concat(new.dueDate," - ",new.serialNumber," - ",new.organization," - ",new.description);

我不知道问题是什么。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

  

我的触发器突然停止工作。

就我自己而言,我会说你的触发器突然开始按预期工作:D


更严重的是,auto_increment字段在插入行之前没有值。

奇怪的是,您可以在BEFORE触发器中访问该auto_increment值,获取其他任何0。

也许您可以切换到AFTER INSERT触发器?


OTOH,如果确实需要在触发器之前访问中的auto_increment值,请尝试在触发器中使用该值:

Set ai = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tbl')

然而,我不知道这对于并发插入表格会如何表现。

答案 1 :(得分:0)

问题是,由于尚未插入行,auto_increment事件中的BEFORE列的值不可用,而AFTER事件中您无法再更改NEW {1}}值。

现在,您可以通过引入单独的表进行排序来克服此问题。

表:

CREATE TABLE bids_seq 
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);

CREATE TABLE bids
(
  serialNumber INT NOT NULL PRIMARY KEY DEFAULT 0, 
  dueDate      DATE, 
  organization VARCHAR(32), 
  description  VARCHAR(32),
  opportunity  VARCHAR(64),
  ...
);

现在你的触发器:

DELIMITER $$
CREATE TRIGGER tg_bids_before_insert
BEFORE INSERT ON bids
FOR EACH ROW
BEGIN
  INSERT INTO bids_seq VALUES (NULL);
  SET NEW.serialNumber = LAST_INSERT_ID(),
      NEW.opportunity = CONCAT_WS(' - ',
                                  NEW.dueDate,
                                  NEW.serialNumber,
                                  NEW.organization,
                                  COALESCE(NEW.description, ''));
END$$
DELIMITER ;

CREATE TRIGGER tg_bids_after_update
BEFORE UPDATE ON bids
FOR EACH ROW
  SET NEW.opportunity = CONCAT_WS(' - ',
                                  NEW.dueDate,
                                  NEW.serialNumber,
                                  NEW.organization,
                                  COALESCE(NEW.description));

这是 SQLFiddle 演示