Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在insert触发器后获得自动递增值,insert后更新字段值给出";“未知列”;错误_Mysql_Triggers - Fatal编程技术网

MySQL在insert触发器后获得自动递增值,insert后更新字段值给出";“未知列”;错误

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”主键字段的值分配给另一个字段“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;
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()
。如果删除最后插入的记录,然后运行此查询,会怎么样?如果由于某种原因,自动增量中存在间隙,例如,如果删除一行或将自动增量设置为更高的数字,则会中断此操作。