插入自增ID行时触发器CONCAT函数返回NULL问题求助
问题解决与原因解释
为什么CONCAT返回NULL?
在BEFORE INSERT触发器执行阶段,MySQL还没有为自增字段id分配具体数值,此时NEW.id的值是NULL。而MySQL的CONCAT()函数有一个核心特性:只要传入的参数中有任意一个是NULL,整个函数的返回值就会变成NULL,这就是你插入数据时photo字段始终为NULL的根本原因。
另外你尝试的第二种写法'https://url-of-folder-with-my-images/' + CONVERT(VARCHAR(5),NEW.id),'.png'完全不适用MySQL:
- MySQL中字符串拼接不能用
+(这是SQL Server的语法),必须用CONCAT()函数; - MySQL的类型转换语法是
CONVERT(expr, CHAR)或CAST(expr AS CHAR),而不是CONVERT(VARCHAR(5), expr)。
解决方案
方案一:使用AFTER INSERT触发器(推荐,无并发问题)
在AFTER INSERT阶段,自增id已经被成功分配,此时可以直接用NEW.id拼接URL,再更新当前记录的photo字段:
DELIMITER $$ CREATE TRIGGER IMAGE_LienApi AFTER INSERT ON studenttable FOR EACH ROW BEGIN UPDATE studenttable SET photo = CONCAT('https://url-of-folder-with-my-images/', NEW.id, '.png') WHERE id = NEW.id; END$$ DELIMITER ;
方案二:BEFORE INSERT阶段获取下一个自增ID(适合低并发场景)
通过查询系统表获取studenttable的下一个自增ID,提前拼接URL:
DELIMITER $$ CREATE TRIGGER IMAGE_LienApi BEFORE INSERT ON studenttable FOR EACH ROW BEGIN DECLARE next_id INT; SELECT AUTO_INCREMENT INTO next_id FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'studenttable'; SET NEW.photo = CONCAT('https://url-of-folder-with-my-images/', next_id, '.png'); END$$ DELIMITER ;
注意:该方案在高并发插入场景下可能出现ID冲突,因为如果多个请求同时获取下一个自增ID,会导致重复拼接的情况,因此优先推荐方案一。
内容的提问来源于stack exchange,提问作者cowbra
相关产品推荐
相关产品推荐

