【问题标题】:Retrieve id of record just inserted into a Java DB (Derby) database检索刚刚插入 Java DB (Derby) 数据库的记录的 id
【发布时间】:2011-06-21 03:40:53
【问题描述】:

我正在使用 JDBC 连接到 Java DB 数据库,并且想要检索插入的最后一条记录的 id(自动递增)。

我看到这是一个常见问题,但我看到 solutions 使用例如 MS SQL Server,Java DB 的等价物是什么?

【问题讨论】:

    标签: sql jdbc javadb


    【解决方案1】:

    对于那些在获取生成的自动增量 ID 时遇到问题的人,就像我以前在 Java Derby 中一样,我的回答可能会有所帮助。

    stmt.executeUpdate("INSERT INTO xx(Name) VALUES ('Joe')", Statement.RETURN_GENERATED_KEYS);
    
    ResultSet rs = stmt.getGeneratedKeys();
    if (rs.next()) {
      int autoKey = rs.getInt(1); //this is the auto-generated key for your use
    } 
    

    here复制的答案

    【讨论】:

      【解决方案2】:

      无需为此使用特定于 DBMS 的 SQL。

      这就是getGeneratedKeys() 的用途。

      preparing your statement 传递自动生成列的名称时,您可以使用 getGeneratedKeys() 检索它们

      PreparedStatement pstmt = connection.prepareStatement(
           "insert into some_table (col1, col2, ..) values (....)", 
            new String[] { "ID_COLUMN"} ); 
      
      pstmt.executeUpdate();
      
      ResultSet rs = pstmt.getGeneratedKeys(); // will return the ID in ID_COLUMN
      

      请注意,在这种情况下,列名区分大小写(在 Derby 和许多其他 DBMS 中)。
      new String[] { "ID_COLUMN"}new String[] { "id_column"} 不同


      您也可以使用:

      connection.prepareStatement("INSERT ...", PreparedStatement.RETURN_GENERATED_KEYS);
      

      【讨论】:

      • 我只是想确认一下,我认为我有 99% 的把握,即使在插入和获取列值之间执行了多个插入语句,这仍然会返回预期的自动生成的列值使用getGeneratedKeys()?
      • 对我不起作用,它也看起来像JDBC doesn't fully support Derby's identity columns?我收到一个异常,说我的表没有名为“id”的自动生成列,它显然有:)
      • 无论如何,我通过使用PreparedStatement.RETURN_GENERATED_KEYS 而不是字符串数组作为 PreparedStatement 中的第二个参数解决了问题。 (如果有人想知道,我很确定我的问题不是拼写错误)。
      • @Alex:我 100% 以上的代码适用于 Apache Derby。您的链接适用于处理 ActiveJDBC 的组 - 这是一个 ORM(="Obfuscated Relational Model")框架在 JDBC 之上。 “JDBC”本身不支持任何东西——它只是一个需要由JDBC驱动供应商实现的规范。这与 Derby 提供的 JDBC 驱动程序无关。如果 that 框架不能与 Derby 一起工作,那既不是“JDBC”的错,也不是 Derby 的错。也许您没有正确指定列,例如new String[] { "ID"} 不是 new String[] { "id"}
      • 哦,我明白了,感谢您的澄清。是的,显然列名区分大小写,我确信它们是双向的,再次感谢@a_horse_with_no_name。无论如何,我都会留下我的评论,只是为了提供一种更通用的方式来获取这些列。
      【解决方案3】:

      您可以使用 IDENTITY_VAL_LOCAL 函数获得所需的内容。 (Derby Reference)

      此函数应该返回“最近为连接分配的标识列值,其中分配是由于使用 VALUES 子句的单行 INSERT 语句而发生的。”

      值得注意的是,该函数将返回 DECIMAL(31,0),而不管对应标识列的实际数据类型如何。

      此外,这适用于包含 VALUES 子句的单行插入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 2011-06-17
        • 2017-07-04
        • 2016-04-12
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多