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触发器不再正常工作的主要内容,如果未能解决你的问题,请参考以下文章