You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:42:04