如何find自动增量列的下一个生成的值?

IBM DB2的自动增量列面临一些麻烦。 起初,我的所有列被定义为GENERATED ALWAYS ,但是由于我在使用“db2 import …”命令时遇到了麻烦,所以我将它们更改为GENERATED BY DEFAULT 。 这是必要的,因为我需要ID是一致的,因为其他表引用它们。 所以使用“db2 import …被identityignore修改…”不是一个选项。

当我现在导入数据时,ID被正确插入,但每次我这样做的时候,我都必须记住通过获得最高的Id + 1来设置自动增量列的新开始,并像这样改变列:

SELECT MAX(mycolumn)+ 1 FROM mytable; ALTER TABLE mytable ALTER COLUMN mycolumn RESTART WITH <above_result>; 

如果我忘记了这一点,一个插入语句将失败并出现重复的PK错误,因为自动增加列是主键。

所以我的问题是:有没有办法find一个自动增量列的下一个值,所以我可以编写语句来检查,如果这个值小于SELECT MAX并且需要设置?

或者:这不是像我看起来那么复杂吗? 我可以以某种方式导入数据,保留ID和自动增量列仍按预期工作?

蒂姆,我面临同样的问题,我需要重新启动身份到下一个值。 我正在使用db2v9.1。

不幸的是,没有办法自动指定下一个值。 根据DB2文档,该值应该是一个“数字常量”。 因此,我不得不做一个select最大(id),获取该值,并手动replace在alter..restart stmt。

我不记得是否我尝试过 – 但是你可以写一个sp,在variables中设置max(id),并在alter … restart stmt中分配variables。 (我无法尝试,因为我不能访问任何db2数据库了)。 我怀疑它会工作。 (如果它的工作,请让我知道:))

DB2参考:

RESTART或RESTART WITH数字常量

重置与标识列关联的序列的状态。 如果未指定WITH numeric-constant,那么标识列的序列会以指定的值(隐式或显式地)作为最初创build标识列时的起始值重新启动。 该列必须存在于指定的表(SQLSTATE 42703)中,并且必须已经使用IDENTITY属性(SQLSTATE 42837)定义。 RESTART不会更改原始的START WITH值。

数字常量是一个确切的数字常量,可以是可以分配给此列(SQLSTATE 42815)的任何正数或负数值,但不存在小数点右侧存在的非零数字(SQLSTATE 428FA)。 数字常量将被用作列的下一个值。

你不能在DB2中使用序列号,然后使用序列。 nextval()?

在DB2中自动生成序列值的链接: http : //www.ibm.com/developerworks/data/library/techarticle/0302fielding/0302fielding.html

现在你的问题可能已经解决了,但是对于所有其他人都有同样的问题:我可以为所有表提供max_id +1的解决scheme。 唯一的限制是,源列必须是自动增量列(GENERATED ='D')。 结果集可以通过clp或其他查询工具来执行。

 SELECT 'alter table ' || rtrim(TABSCHEMA) || '.' || TABNAME || ' alter column ' || COLNAME || ' restart with ' || cast((case when (trim ((replace ( HIGH2KEY, '+' , '' )))) = '' then 0 else integer(trim ((replace ( HIGH2KEY, '+' , '' ))))+2 end) as varchar(20)) || ' ;' FROM SYSCAT.COLUMNS WHERE GENERATED = 'D' 
  1. 为什么你甚至会考虑使用自动增量,如果你手动导入该列的数据? 这个自动增量没有被使用,
  2. 在这里的一个类似的应用程序,我写了一个SP – 一个。 调用admin_cmd – 加载选项b。 selectmax(id) – 并将它们与当前时间戳一起加载到日志表中只需查询日志表并使用bash / windows脚本进行更新即可。 简单….