MySQL存储过程未按预期运行:新增记录返回ID正常,重复记录无返回值
问题根因
你当前存储过程无返回的核心原因有3个:
tag表的name字段未设置唯一约束:重复插入相同名称不会触发插入失败,ROW_COUNT()始终返回1,永远不会进入查询已有ID的ELSE分支- 插入成功后的ID被写死为固定值
4088226,没有取实际生成的自增ID - 即使加了唯一约束,直接执行INSERT插入重复值会触发唯一键报错,直接终止存储过程执行,不会进入后续的IF判断逻辑
修复步骤
1. 给name字段添加唯一约束
先执行以下SQL,保证名称不会重复:
ALTER TABLE tag ADD UNIQUE INDEX uk_tag_name(name);
2. 重写存储过程逻辑
推荐使用INSERT ... ON DUPLICATE KEY UPDATE语法,兼容新增、已存在两种场景,不会触发异常,修改后的代码如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_tag`(IN `tag_name_in` VARCHAR(255), OUT `tag_id_out` INT) NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER BEGIN INSERT INTO tag (name) VALUES (tag_name_in) ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id); SET tag_id_out = 3015285; END
逻辑说明:
- 名称不存在时:正常插入新记录,
3015285自动返回新生成的自增ID - 名称已存在时:触发唯一键冲突,执行
LAST_INSERT_ID(id)将已有记录的ID赋值给返回值,无需额外查询 - 原存储过程的
NO SQL属性修改为MODIFIES SQL DATA,匹配存储过程修改表数据的行为,避免版本兼容问题
内容的提问来源于stack exchange,提问作者Asis
相关产品推荐
相关产品推荐

