mysql触发器不再正常工作

Posted

技术标签:

【中文标题】mysql触发器不再正常工作【英文标题】:mysql trigger not working right anymore 【发布时间】:2013-08-01 16:30:22 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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


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

奇怪的是,您可以在 BEFORE 触发器中访问该 auto_increment 值,从而获得 0 以外的任何值。

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


OTOH,如果您真的需要从您的 before 触发器访问 auto_increment 值,请尝试在您的触发器中使用它:

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

但是我不知道这对于并发插入到您的表中会有什么影响。

【讨论】:

【参考方案2】:

问题是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演示

【讨论】:

以上是关于mysql触发器不再正常工作的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 触发器使用不同的 TIMEZONE

在 phpmyadmin 上插入触发器

MySQL 5.5.30 级联触发器不起作用

SQLite - 将 MySQL 触发器转换为在 SQLite 上工作

在mysql datetime上触发java函数

MySql第触发器