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'