DB2唯一索引和自动编号

时间:2010-12-28 17:00:06

标签: java db2 indexing autonumber

得到了上周我遇到的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);

正如您所看到的,除了第一个URID之外,它传递的是SQL字符串中的所有值。插入记录后,我可以在数据库中看到它带有ID号,这对我来说意味着数据库是自动添加URID(也就是说,ID没有在Java代码中生成,然后传递给数据库) )。在我之前使用Oracle和PHP的经验中,我使用Oracle Sequences来创建自动编号字段,我知道MySQL,Postgres和其他数据库系统中有类似的功能,但是我还没有找到自动编号在DB2中有效。

我更熟悉DB2的同事也感到困惑;他说,根据他所看到的情况,桌面上没有设置触发器,而且一般在RPG代码中,这听起来像ID号在代码中生成然后传递到数据库,而不是由数据库生成本身。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

DB2的方法是在URID列定义中添加GENERATED BY DEFAULT或GENERATED ALWAYS:

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

GENERATED BY DEFAULT可让您在需要时指定自定义值。

我建议查看CREATE TABLE声明的文档。