我有一个名为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值尚未启动。
那么我该如何解决这个问题?
答案 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代码之后直接运行。不理想,但它就是它。