Java DB2唯一索引和自动编号

Java DB2唯一索引和自动编号,java,db2,indexing,autonumber,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, U

在得到了上周我遇到的一个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的同事也感到困惑;他说,根据他所看到的,没有在表上设置触发器,而且在这里的RPG代码中,一般来说,ID号在代码中生成,然后传递到数据库,而不是由数据库本身生成

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

我接下来的问题是:我最终需要使用URID号插入到另一个存储相关数据的表中。在Oracle中,这是通过“insert into returning into”完成的,然后从代码中的参数化id_变量中获取数据。DB2中有类似的特性吗?我找到了一个IDENTITY\u VAL\u LOCAL函数的文档,但我似乎不能保证它会返回正确的ID,例如,如果在第一次插入和调用IDENTITY\u VAL\u LOCAL之间从web表单发生另一次插入


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

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

DB2实现这一点的方法是在URID列定义中添加默认生成或始终生成的:

URID int NOT NULL
  GENERATED BY DEFAULT AS IDENTITY( START WITH 1, INCREMENT BY 1 )
  UNIQUE
默认情况下生成的将允许您在需要时指定自定义值


我建议您查看该语句的文档。

我想您会发现IDENTITY\u VAL\u LOCAL的作用域是连接…@kem:我很高兴地说,我找到了一个Java方法,它返回最后使用的ID(prepareStatement(sql,statement.RETURN\u生成的\u键)),因此我不必担心任何潜在的竞争条件,但我仍然对DB2如何处理自动编号感到好奇。似乎每个SQL实现都有不同的做法。“标准的好处在于有很多可供选择的内容”我想…我确实在DB2文档中看到了默认生成/始终生成的,但在上面列出的表创建语句中我没有看到,所以我们一直在假设this表没有使用它的情况下运行。。。值得一提的是,我将SquirrelSQL客户机与JDBCODBC桥一起使用,我不完全确定它是否显示了创建表的确切内容。是否有其他DB2可能使用的自动编号源?我不确定它们是在哪个版本的DB2中引入的,但您也可以使用序列。createsequence()的文档中有一些示例。