全局序列使用疑问:ID不连续、起始值异常及序列复用问题
关于共享序列的ID生成问题解答
1. 为何ID无法逐个连续生成?
你的序列设置了CACHE 20,数据库会预先缓存20个序列值,一旦数据库重启或会话异常中断,缓存中未使用的序列值会直接丢弃,造成ID跳号。另外,多个表共享同一序列时,不同表的插入操作会交替获取序列值,从单个表的视角看,ID自然无法保持连续——比如表A取了1,表B取了2,表A再取3,表A的ID就是1、3,出现断号。
2. 为何部分数据表的首条记录ID起始值为126这类非初始值?
你的序列START WITH 201,说明序列初始就从201开始计数。当多个表共享该序列时,若其他表先执行插入操作消耗了部分序列值,等目标表第一次插入时,序列已走到126这类数值,所以首条记录ID就是当前序列的下一个可用值。此外,之前发生过缓存序列值丢弃的情况,也会导致起始值偏离预期。
3. 是否需要为每个数据表单独创建序列?
如果要求每个表的ID严格连续、独立计数,必须为每个表单独创建序列。若仅需要唯一标识记录,不要求单表ID连续,共享序列也可使用,但要接受跳号和跨表占用序列值的情况。通常业务场景中,单表单独使用序列更符合ID语义(每个表的ID是自身的自增标识),也能规避共享带来的ID不连续、起始值异常等问题。
你的序列创建语句
CREATE SEQUENCE "MMDS"."NEXT_ID" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 201 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL ;
内容的提问来源于stack exchange,提问作者Pitt Bear
相关产品推荐
相关产品推荐

