MySQL在insert触发器后获得自动递增值,insert后更新字段值给出";“未知列”;错误
我试图找出一个触发器,将插入时自动生成的自动递增“ID”主键字段的值分配给另一个字段“Sort_Placement”,以便插入后它们相同 如果您想知道我为什么这样做,“Sort_Placement”用作表中的排序值,可以更改,但默认情况下,记录会添加到表的底部 表格数据MySQL在insert触发器后获得自动递增值,insert后更新字段值给出";“未知列”;错误,mysql,triggers,Mysql,Triggers,我试图找出一个触发器,将插入时自动生成的自动递增“ID”主键字段的值分配给另一个字段“Sort_Placement”,以便插入后它们相同 如果您想知道我为什么这样做,“Sort_Placement”用作表中的排序值,可以更改,但默认情况下,记录会添加到表的底部 表格数据 `ID` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `Account_Num` mediumint(8) unsigned NOT NULL, `Product_Num` me
`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;
ERROR 1054: Unknown column 'Sort_Placement' in 'field list'
我尝试过使用“NEW”前缀的多种组合,但运气不佳。例如,将新前缀放在每个字段名之前
尝试一下
INSERT INTO `order_guide` (`Account_Num`, `Product_Num`) VALUES ('5966', '3');
插入错误
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;
ERROR 1054: Unknown column 'Sort_Placement' in 'field list'
这看起来有点像黑客的工作,但我能够使用MySQL中最后一个内置的函数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;
我遇到了一个类似(但不同)的需求,表中的字段值需要基于新记录的自动增量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模块为模型。生成的ID的长度很大,但工作正常,在插入之前我知道该值,因此我可以使用它为其他字段生成值。看起来您试图将新记录的排序位置值设置为自动增量ID。但是,在'after'中不允许更新新行'触发器如果要新建.Sort\u Placement=NEW.ID,只需使用
SET NEW.Sort\u Placement=LAST\u INSERT\u ID()
。如果删除最后插入的记录,然后运行此查询,会怎么样?如果由于某种原因,自动增量中存在间隙,例如,如果删除一行或将自动增量设置为更高的数字,则会中断此操作。