2

我的触发器突然停止工作。它工作正常,现在只工作了一半。触发器正在连接我为其编码的特定列,但现在对于其中一列(自动增量 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);

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

4

2 回答 2

0

问题是auto_increment列的值在事件中不可用,BEFORE因为尚未插入行,并且在AFTER事件中您不能再更改NEW值。

现在,您可以通过引入一个单独的表来进行排序来解决这个问题。

表:

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

于 2013-08-01T18:48:16.663 回答
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')

但是,我不知道这对于并发插入表的行为会有什么影响。

于 2013-08-01T16:36:15.757 回答