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

Modified on: Wed, 15 May 2019 22:40:04 +0800

我在使用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>;

如果我忘记了这一点,Insert-Statement将失败并出现重复的PK错误,因为自动增量列是主键。

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

或者:
这整件事情在我看来并不复杂吗?我可以以某种方式导入数据,保留ID并使自动增量列仍按预期工作吗?

作者:Tim Büthe

最佳答案

蒂姆,我遇到了同样的问题,我需要将身份重新启动到下一个值。我使用的是db2v9.1。

不幸的是,无法自动指定下一个值。根据DB2文档,该值应为“数字常量”。因此,我必须执行select max(id),获取值并手动将其替换为alter..restart stmt。

我不记得我是否尝试过这个 - 但是你可以编写一个sp,其中max(id)在变量中设置并在alter ... restart stmt中分配变量。 (我无法尝试,因为我不再访问任何db2数据库)。我怀疑它会起作用。 (如果有效,请告诉我:))

DB2参考:

使用数字常量重新启动或重新启动

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

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


相关问答

添加新评论