DB2中修改表内定义序列最大值问题:ALTER SEQUENCE语句失效
DB2修改序列最大值失效的解决方法
先明确对象类型:独立序列 vs 表IDENTITY列
很多人会混淆DB2的独立序列对象和表IDENTITY生成列,这两类对象的修改语法完全不同,先确认你要修改的是哪一种:
1. 修改独立序列对象的最大值
如果是用CREATE SEQUENCE创建的独立序列,正确的修改语法必须指定MAXVALUE子句,示例:
-- 设置具体最大值 ALTER SEQUENCE "sequencename" MAXVALUE 999999999; -- 设置为无上限 ALTER SEQUENCE "sequencename" MAXVALUE NO MAXVALUE;
常见失效原因及排查:
- 序列名大小写问题:如果序列创建时用了双引号(大小写敏感),修改时必须带双引号;如果是默认大写创建,不带引号也可。用以下语句确认序列存在:
SELECT SEQNAME, MAXVALUE, SCHEMANAME FROM SYSCAT.SEQUENCES WHERE SEQNAME = 'sequencename'; - 权限不足:需要拥有
ALTER SEQUENCE权限或ALTER ANY SEQUENCE权限,可通过以下语句检查:SELECT AUTHID, ALTERSEQ FROM SYSCAT.DBAUTH WHERE AUTHID = CURRENT_USER; - 当前值超过新最大值:如果序列已启用循环(CYCLE)且当前值大于新设置的最大值,执行
NEXTVAL会报错,需先重启序列到合法值:ALTER SEQUENCE "sequencename" RESTART WITH 1; -- 替换为小于新最大值的数值
2. 修改表IDENTITY列的最大值(误称为“表内序列”)
如果是表中用GENERATED ALWAYS AS IDENTITY定义的自增列,这不是独立序列,必须用ALTER TABLE修改,示例:
ALTER TABLE "tablename" ALTER COLUMN "identity_colname" SET MAXVALUE 999999; -- 或 NO MAXVALUE 设置无上限
验证修改结果:
- 独立序列:
SELECT SEQNAME, MAXVALUE FROM SYSCAT.SEQUENCES WHERE SEQNAME = 'sequencename'; - IDENTITY列:
SELECT COLNAME, MAXVALUE FROM SYSCAT.COLUMNS WHERE TABNAME = 'tablename' AND GENERATED = 'A';
内容的提问来源于stack exchange,提问作者vivek singh
相关产品推荐
相关产品推荐

