0

上周我遇到了一个 Java 问题的答案(谢谢!),我现在开始处理 DB2 的一个新问题……我正在开发的 Java 应用程序从 Web 表单中获取数据并放入DB2 文件(数据库)。传递给 Java PreparedStatement 对象的 SQL 字符串是:

insert into EVCRPTFL (
        AUID, URLEX, URNEX, URNAME, URRCPT, URRUN, URRECT, URRECS, URRDYS, URRWKS, URRMHS, URRMTH, URRDAY, URRTHE, URRWHT, URRWDY, UREXPT, UROCRM, UROCRN, UREXPR, URSTTS, URACTV, URRPT, URD1YR, URD1YN, URD1MR, URD1MN, URD1DR, URD1DN, URD2YR, URD2YN, URD2MR, URD2MN, URD2DR, URD2DN, URRPAR, URLANG, URCTRY
    )
    values (
        ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
    )

这是表创建脚本:

CREATE TABLE EVCRPTFL (
    URID int NOT NULL,
    AUID decimal(11,0) NOT NULL,
    URLEX timestamp,
    URNEX timestamp,
    URNAME varchar(40) NOT NULL,
    URRCPT varchar(500) NOT NULL,
    URRUN timestamp,
    URRECT char(1) NOT NULL,
    URRECS int NOT NULL,
    URRDYS int NOT NULL,
    URRWKS int NOT NULL,
    URRMHS int NOT NULL,
    URRMTH int NOT NULL,
    URRDAY int NOT NULL,
    URRTHE int NOT NULL,
    URRWHT int NOT NULL,
    URRWDY int NOT NULL,
    UREXPT int NOT NULL,
    UROCRM int NOT NULL,
    UROCRN int NOT NULL,
    UREXPR timestamp,
    URSTTS char(1) NOT NULL,
    URACTV timestamp,
    URRPT int NOT NULL,
    URD1YR int,
    URD1YN int,
    URD1MR int,
    URD1MN int,
    URD1DR int,
    URD1DN int,
    URD2YR int,
    URD2YN int,
    URD2MR int,
    URD2MN int,
    URD2DR int,
    URD2DN int,
    URRPAR varchar(1000),
    URLANG char(2),
    URCTRY char(2)
);

CREATE UNIQUE INDEX EVCRPTFL ON EVCRPTFL(URID);

如您所见,它传递了 SQL 字符串中的所有值,但第一个值 URID 除外。插入一条记录后,我可以在数据库中看到它带有一个ID号,这对我来说意味着数据库正在自动添加URID(即ID不是在Java代码中生成然后传递给数据库)。在我之前使用 Oracle 和 PHP 的经验中,我使用 Oracle 序列来制作自动编号字段,并且我知道 MySQL、Postgres 和可能的其他数据库系统中存在大致相似的功能,但我无法找到如何自动编号在 DB2 中有效。

我对 DB2 比较熟悉的同事也很疑惑;他说根据他所看到的,桌子上没有设置Triggers,而且这里的RPG代码中通常听起来ID号是在代码中生成然后传递给数据库,而不是由数据库生成本身。

所以我的问题是:URID 上的唯一索引是否也会自动生成 ID 号,还是我需要在数据库或 Java 代码中查找其他内容?

我的后续问题是:我最终将需要使用 URID 号来插入另一个存储相关数据的表。在 Oracle 中,这是通过“插入返回”然后从代码中的参数化 id_variable 中取回数据来完成的。DB2 中是否有类似的特性?我找到了关于 IDENTITY_VAL_LOCAL 函数的文档,但看起来我不能总是保证它会返回正确的 ID,例如,如果在第一次插入和调用 IDENTITY_VAL_LOCAL 之间的 Web 表单中发生另一个插入...

如果需要,我可以提供代码示例或其他数据库信息。谢谢!

4

1 回答 1

0

URID 上的唯一索引不会自动生成 ID 号。

执行此操作的 DB2 方法是将 GENERATED BY DEFAULT 或 GENERATED ALWAYS 添加到您的 URID 列定义中:

URID int NOT NULL
  GENERATED BY DEFAULT AS IDENTITY( START WITH 1, INCREMENT BY 1 )
  UNIQUE

GENERATED BY DEFAULT 将允许您在需要时指定自定义值。

我建议查看CREATE TABLE语句的文档。

于 2010-12-28T22:36:21.400 回答