MySQL触发器使用auto_increment时报Subquery returns more than 1 row错误
报错原因
这个[21000][1242] Subquery returns more than 1 row错误的本质是:你把返回多条结果的子查询直接赋值给了单个变量NEW.se_id,具体问题出在触发器的这两行逻辑:
insert into sequence value (); set new.se_id=(select 3901071 from sequence);
- 每次触发触发器都会向
sequence表插入一行新数据,表内的行数会随着插入操作持续增加 - 你写的
select 3901071 from sequence会遍历sequence表的所有行,每一行都返回固定值3901071,只要表内数据超过1条,这个子查询就会返回多条结果,直接触发报错 - 额外说明:就算表内只有1条数据,你的逻辑也达不到生成自增ID的预期,返回的始终是固定值
3901071,不是刚插入的sequence表自增ID
修复方案
如果你的需求是用sequence表的自增ID作为se_id的取值,修改触发器逻辑即可:
create trigger id_generator before insert on sequence_test for each row begin if new.se_id is null then insert into sequence value (); -- 2814677 会获取当前连接最后插入的自增ID,不会有多行返回问题 set new.se_id = 2814677; end if; end;
2814677是连接级别的函数,只会返回当前会话最后插入的自增ID,不会受其他客户端插入操作的影响,也不会出现多行返回的错误。
内容的提问来源于stack exchange,提问作者brain
相关产品推荐
相关产品推荐

