为何执行INSERT ALL语句时未插入数据,TEST序列仍自增1?
问题:未插入数据时序列为何仍会自增?
场景说明
每次执行下方SQL语句时,SEQUENCE(序列)的数值都会自增1,但实际上并没有向目标表中插入数据,疑问:为何即使未向目标表中插入数据,序列仍会发生自增?
执行的SQL语句
INSERT ALL WHEN ID = 23 THEN INTO ARTICLES (ID, NAME, DESCRIPTION) VALUES (TEST.NEXTVAL, NAME, DESCRIPTION) WHEN ID > 100 THEN INTO BOOKS (ID, NAME) VALUES (TEST.NEXTVAL, NAME) SELECT 98 as ID, 'Mark Seemann' AS NAME, 'DEPENDENCY INJECTION' as DESCRIPTION FROM DUAL
解答
这是因为Oracle的INSERT ALL语句会先解析所有VALUES子句,无论对应的WHEN条件是否满足。
你的SQL里两个WHEN分支都用到了TEST.NEXTVAL,Oracle执行这条语句时,会先执行SELECT子句获取数据,接着扫描所有WHEN条件和对应的VALUES部分——哪怕某个WHEN条件不成立(比如这次查询的ID=98,既不等于23也不大于100),Oracle依然会解析VALUES里的TEST.NEXTVAL,直接触发序列自增。
说白了,只要NEXTVAL出现在语句中被解析到,不管最终有没有实际插入数据,序列都会自动加1。
内容的提问来源于stack exchange,提问作者KAAMIRLI
相关产品推荐
相关产品推荐

