5

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

2 回答 2

7

这看起来有点像 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;
于 2013-05-16T22:11:00.597 回答
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 很长,但它们工作得很好,而且我在插入之前就知道值,所以我可以用它来为其他字段生成值。

于 2015-02-15T09:30:40.493 回答