我的触发器突然停止工作。它工作正常,现在只有一半的工作。触发器连接了我为其编写的特定列,但现在对于其中一列(自动增量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);
我不知道问题是什么。有什么建议吗?
答案 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 演示