繁体   English   中英

为什么此BEFORE INSERT触发器在MySQL中不起作用?

[英]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 $$

这个问题似乎是一个重复这个问题

根据这个问题 ,插入后设置自动递增。 因此,不要指望new.field值在before触发器中为您检索它。

在发布问题:S之前,您应该更好地搜索现有问题。

如果您的问题不是关于新功能或新软件/硬件的,那么在此站点上超过600万的问题中,很可能已经有人提出并回答了它。

正如在SO上类似问题中所解释的那样,在MySQL触发器的上下文中,我想做的事是不可能的,唯一的解决方案是做我已经在做的事情来解决此问题:处理需要在存储过程中现有的INSERT代码之后直接运行。 这并不理想,但事实就是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM