[英]Why is this BEFORE INSERT trigger not working in MySQL?
我有一个名为Base52Encode的MySql函数,该函数接受bigint并返回varchar(12)。
我有一个名为Things的表,该表的主键为biging auto_increment,为ThingId,第二列为varchar(12),称为ShortCode。
我想将ShortCode的值设置为ThingId主键的base-52编码值,该值是通过auto_increment创建的。
DELIMITER $$
CREATE TRIGGER BeforeInsertThings
BEFORE INSERT ON Things
FOR EACH ROW
BEGIN
set new.ShortCode = Base52Encode(new.ThingId);
END $$
但是,每当我插入一行时,ShortCode值始终设置为0(零),这意味着传递给Base52Encode的值也为零。
我假设问题是在运行此触发器时,尚未启用auto_increment值。
那么我该如何解决这个问题呢?
尝试这个
DELIMITER $$
CREATE TRIGGER BeforeInsertThings
BEFORE INSERT ON Things
FOR EACH ROW
BEGIN
Select ThingId into largestId order by ThingId Desc limit 1;
Set newThingId = largestId + 1;
set new.ShortCode = Base52Encode(newThingId);
END $$
我认为它不起作用的原因是,当您插入一行时,您没有指定主键,因为您希望它只是自动递增。 因此,您没有new.ThingId
值。 您可以使用AFTER INSERT
而不是BEFORE INSERT
轻松解决此问题:
DELIMITER $$
CREATE TRIGGER AfterInsertThings
AFTER INSERT ON Things
FOR EACH ROW
BEGIN
set new.ShortCode = Base52Encode(old.ThingId);
# Or, you could use:
# set new.ShortCode = Base52Encode(last_insert_id());
END $$
正如在SO上类似问题中所解释的那样,在MySQL触发器的上下文中,我想做的事是不可能的,唯一的解决方案是做我已经在做的事情来解决此问题:处理需要在存储过程中现有的INSERT代码之后直接运行。 这并不理想,但事实就是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.