You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

创建的序列起始值与分配值一致的原因排查咨询

分析序列分配值与起始值相同的原因

别担心,这种情况其实挺常见的,结合你给出的序列创建语句和SYSSEQUENCES视图的信息,我整理了几个最可能的原因:

  • 序列刚创建,还从未被调用过
    当你执行CREATE SEQUENCE CA_SEQUENCE_NUMBER_SEQ start with 9000000000 increment by 1 nocycle nocache;创建序列后,它的初始状态就是你指定的起始值9000000000。只有当你通过NEXTVAL获取下一个序列值时,它才会按照INCREMENT BY 1的规则递增。如果到现在你还没执行过类似SELECT CA_SEQUENCE_NUMBER_SEQ.NEXTVAL FROM xxx;的调用,那么不管是查询序列的当前值(CURRVAL)还是查看SYSSEQUENCES视图,显示的都会是起始值,看起来就像是分配值和起始值完全一致。

  • SYSSEQUENCES视图的字段定义逻辑
    不同数据库的系统字典视图存储规则可能有差异,比如有些数据库的SYSSEQUENCES里保存的是序列的起始基准值,而非当前已使用的最大值。你可以通过实际调用一次NEXTVAL来验证:执行获取下一个序列值的语句后,再去查询SYSSEQUENCES,看看对应字段的数值是否已经更新。

  • 事务回滚导致的视觉误解(概率较低)
    序列的NEXTVAL是独立于事务的——也就是说一旦你调用NEXTVAL拿到了下一个值,哪怕后续事务回滚,序列的递增状态也不会回滚。但如果刚好你调用NEXTVAL后立刻回滚,又没有再次调用NEXTVAL,可能会误以为序列没变化?不过这种情况里,下一次调用NEXTVAL会直接跳到9000000002,所以这个可能性比较小,更大概率是第一种情况。

验证步骤

你可以试试执行这个命令(根据你的数据库类型调整):

-- 以Oracle为例
SELECT CA_SEQUENCE_NUMBER_SEQ.NEXTVAL FROM DUAL;
-- 如果是Informix
SELECT CA_SEQUENCE_NUMBER_SEQ.NEXTVAL FROM systables WHERE tabid=1;

执行完后再查询SYSSEQUENCES视图,对比之前的截图,应该就能看到序列值已经递增了。

内容的提问来源于stack exchange,提问作者Sas

火山引擎 最新活动