我试图找出触发器来分配自动生成的自动生成的'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'
答案 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很大长度,但它们运行良好,我知道插入之前的值,所以我可以用它来为其他字段生成值。