【问题标题】:Primary key from inserted row jdbc?插入行jdbc的主键?
【发布时间】:2010-09-17 03:27:12
【问题描述】:

有没有跨数据库平台的方式来获取你刚刚插入的记录的主键?

我注意到this answer 说您可以通过调用SELECT LAST_INSERT_ID() 来获取它,我认为您可以调用SELECT @@IDENTITY AS 'Identity'; 在jdbc 中跨数据库执行此操作的通用方法吗?

如果不是,你建议我如何为一段可以访问 SQL Server、MySQL 和 Oracle 的代码实现这个?

【问题讨论】:

    标签: java jdbc identity


    【解决方案1】:

    只需将 id 列声明为 id 整数而不是 NULL 主键 auto_increment

    之后执行这段代码

    ResultSet ds=st.executeQuery("select * from user");
                    while(ds.next())
                    {
    
                     ds.last();
                    System.out.println("please note down your registration id  which is "+ds.getInt("id"));
                    }
                    ds.close();
    

    上面的代码会显示当前行的id

    如果您删除 ds.last(),它将显示 id 列的所有值

    【讨论】:

      【解决方案2】:

      extraneon 的回答虽然正确,但不适用于 Oracle

      您为 Oracle 执行此操作的方式是:

      String key[] = {"ID"}; //put the name of the primary key column
      
      ps = con.prepareStatement(insertQuery, key);
      ps.executeUpdate();
      
      rs = ps.getGeneratedKeys();
      if (rs.next()) {
          generatedKey = rs.getLong(1);
      }
      

      【讨论】:

      • 使用 Oracle 11g Express 和 Java 8 为我工作。
      • 成功了!应该特别注意rs.getLong(1),您必须提供索引而不是名称
      【解决方案3】:

      对于符合 SQL-99 的数据库,您可以使用标识列: CREATE TABLE sometable (id INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 101) PRIMARY KEY, ...

      使用getGeneratedKeys() 检索刚刚使用executeUpdate(String sql, int autoGeneratedKeys) 插入的密钥。使用 Statement.RETURN_GENERATED_KEYS 作为第二个参数来执行Update()

      【讨论】:

        【解决方案4】:

        Spring 为this operation 提供了一些有用的支持,参考指南似乎回答了您的问题:

        没有标准的单一方法 创建一个合适的 PreparedStatement(这解释了为什么 方法签名就是它的方式 是)。适用于 Oracle 的示例 并且可能无法在其他平台上运行 是……

        我已经在 MySQL 上测试了这个例子,它也可以在那里工作,但我不能代表其他平台。

        【讨论】:

          【解决方案5】:

          您尝试过Statement.executeUpdate()Statement.getGeneratedKeys() 方法吗?有一个developerWorks article 提到了这种方法。

          此外,Sun 在 JDBC 4.0 中添加了row_id feature,它允许您在一行中获得唯一的句柄。 Oracle 和 DB2 支持该特性。对于 sql server,您可能需要第三方驱动程序,例如 this one

          祝你好运!

          【讨论】:

            【解决方案6】:

            对于 oracle,如果您已映射序列以生成 PKEY 值,Hibernate 将使用序列中的 NEXT_VALUE。

            不确定它对 MySQL 或 MS SQL 服务器有什么作用

            【讨论】:

              【解决方案7】:

              复制自我的代码:

              pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);
              

              其中 pInsertOid 是准备好的语句。

              然后你就可以获得密钥了:

              // fill in the prepared statement and
              pInsertOid.executeUpdate();
              ResultSet rs = pInsertOid.getGeneratedKeys();
              if (rs.next()) {
                int newId = rs.getInt(1);
                oid.setId(newId);
              }
              

              希望这能给你一个好的起点。

              【讨论】:

              • 适用于 Postgres,但不适用于 Oracle
              • 在 Sybase ASE 上,如果您已经安装了元数据访问器信息表,这将起作用。否则你必须使用@@identity
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-28
              相关资源
              最近更新 更多