插入触发器后的MySQL获取自动递增值,插入后更新字段值给出“未知列”错误

时间:2013-05-16 21:05:09

标签: mysql triggers

我试图找出触发器来分配自动生成的自动生成的'ID'主键字段的值,插入到另一个字段'Sort_Placement',因此插入后它们是相同的。

如果您想知道我为什么这样做,'Sort_Placement'用作表中可以更改的排序值,但默认情况下,记录会添加到表的底部

表格数据

`ID` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`Account_Num` mediumint(8) unsigned NOT NULL,
`Product_Num` mediumint(8) unsigned NOT NULL,
`Sort_Placement` mediumint(8) unsigned DEFAULT NULL,
`Order_Qty_C` smallint(6) NOT NULL DEFAULT '0',
`Order_Qty_B` smallint(6) NOT NULL DEFAULT '0',
`Discount` decimal(6,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`ID`),
UNIQUE KEY `ID_UNIQUE` (`ID`)

插入触发后

CREATE 
TRIGGER `order_guide_insert_trigger`
AFTER INSERT ON `order_guide`
FOR EACH ROW
    BEGIN
    IF Sort_Placement IS NULL THEN
        SET Sort_Placement = NEW.ID;
    END IF;
END;

我尝试了一堆使用“NEW”前缀但没有运气的组合。例如,在每个字段名称前加上NEW前缀。

试用

INSERT INTO `order_guide` (`Account_Num`, `Product_Num`) VALUES ('5966', '3');

插入错误

ERROR 1054: Unknown column 'Sort_Placement' in 'field list'

2 个答案:

答案 0 :(得分:7)

这看起来像是一个黑客工作,但我能够使用MySQL内置的LAST_INSERT_ID()函数使其工作。

CREATE TRIGGER `order_guide_insert_trigger`
BEFORE INSERT ON `order_guide`
FOR EACH ROW 
BEGIN
    IF NEW.Sort_Placement IS NULL THEN
        SET NEW.Sort_Placement = LAST_INSERT_ID() + 1;
    END IF;
END;

这也有效,似乎有效

CREATE TRIGGER `order_guide_insert_trigger`
BEFORE INSERT ON `order_guide`
FOR EACH ROW 
BEGIN
    IF NEW.Sort_Placement IS NULL THEN
        SET NEW.Sort_Placement = (SELECT ID FROM order_Guide ORDER BY id DESC LIMIT 1) + 1;
    END IF;
END;

答案 1 :(得分:0)

我遇到了类似(但不同)的要求,其中表中的字段值需要基于新记录的自动增量ID。我找到了两个对我有用的解决方案。

第一种选择是使用每60秒运行一次的事件计时器。该事件更新了我的字段设置为默认值为null的记录。如果您不介意长达60秒的延迟(如果正在更新的字段已编入索引,则可以每1秒运行一次),这不是一个糟糕的解决方案。基本上事件就是这样:

CREATE EVENT `evt_fixerupper`
ON SCHEDULE EVERY 1 MINUTE
ENABLE
COMMENT ''  DO
BEGIN
  UPDATE table_a SET table_a.other_field=CONCAT(table_a.id,'-kittens')
  WHERE ISNULL(table_a.other_field);
END;

另一种选择是生成我自己唯一的主ID(而不是依赖于AUTOINCREMENT。在这种情况下,我使用了一个在perl模块https://metacpan.org/pod/Data::Uniqid之后建模的函数(在我的应用程序中)。生成的ID很大长度,但它们运行良好,我知道插入之前的值,所以我可以用它来为其他字段生成值。