【问题标题】:MySQL after insert trigger get auto incremed value, update field value after insert gives "Unknown column" error插入触发器后MySQL获取自动递增值,插入后更新字段值给出“未知列”错误
【发布时间】:2013-05-11 22:31:30
【问题描述】:

我试图找出一个触发器来分配自动递增的“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'

【问题讨论】:

  • 您似乎试图将新记录的 Sort_Placement 的值设置为自动增量 ID。但是,在“之后”触发器中不允许更新新行

标签: mysql triggers


【解决方案1】:

我遇到了类似(但不同)的要求,表中的字段值需要基于新记录的自动增量 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 的长度很大,但它们工作得很好,而且我在插入之前就知道值,所以我可以用它来为其他字段生成值。

【讨论】:

    【解决方案2】:

    这看起来有点像 hack 工作,但我能够使用 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;
    

    【讨论】:

    • 如果你想要 NEW.Sort_Placement = NEW.ID ,只需使用SET NEW.Sort_Placement = LAST_INSERT_ID()
    • 如果删除最后插入的记录然后运行此查询会怎样?
    • 如果由于某种原因您在自动增量中存在间隙,例如如果您删除一行或将自动增量设置为更高的数字,则会中断。
    猜你喜欢
    • 2016-10-13
    • 2019-04-28
    • 2015-11-06
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多