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

时间:2014-04-13 01:03:21

标签: mysql sql triggers

我有一个名为Base52Encode的MySql函数,它接受一个bigint并返回一个varchar(12)。

我有一个名为Things的表,其主键为bigint 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值尚未启动。

那么我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

试试这个

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 $$

答案 1 :(得分:0)

我假设它不起作用的原因是因为当你插入一行时,你不能指定一个主键,因为你希望它只是自动递增。因此,您没有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 $$

答案 2 :(得分:0)

此问题似乎与this question重复。

根据this question,在插入后设置自动增量。所以不要指望new.field值在之前的触发器中为你检索它。

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

如果您的问题不是关于新功能或新软件/硬件,那么很有可能已经在本网站上的超过6百万条问题中提出并回答了问题...

答案 3 :(得分:0)

正如this similar question on SO中所解释的那样,在MySQL的触发器环境中我想要做的事情是不可能的,唯一的解决方案是做我正在做的事情来解决这个问题:处理额外的逻辑需要在我的存储过程中的现有INSERT代码之后直接运行。不理想,但它就是它。