当前位置:  开发笔记 > 编程语言 > 正文

如何从最后插入的行中获取值?

如何解决《如何从最后插入的行中获取值?》经验,为你挑选了6个好方法。

有没有办法从最后插入的行中获取值?

我正在插入一个PK将自动增加的行,我想得到这个PK.只有PK才能保证在表中是唯一的.

我正在使用Java和JDBC和PostgreSQL.



1> Luc M..:

使用PostgreSQL,您可以通过RETURNING关键字来完成:

PostgresSQL - 返回

INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield

它将返回"anyfield"的值."anyfield"可以是序列与否.

要与JDBC一起使用,请执行以下操作:

ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID");
rs.next();
rs.getInt(1);


这当然是正确的SQL方法,但问题是如何使用JDBC执行此操作,另一半问题是如何执行该语句.正如其他答案中所提到的,你需要使用`executeQuery()`(返回一个ResultSet)而不是`executeUpdate()`(返回更新的行数),或者使用`RETURN_GENERATED_KEYS`选项来激活调用`的能力.调用`executeUpdate()`后的getGeneratedKeys()`方法.

2> Andrew Watt..:

请参阅java.sql.Statement的API文档.

基本上,当你打电话executeUpdate()executeQuery()使用Statement.RETURN_GENERATED_KEYS常数时.然后,您可以调用getGeneratedKeys以获取由该执行创建的所有行的自动生成的键.(假设您的JDBC驱动程序提供它.)

它有点像这样:

Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();


哦,如果这很容易.不幸的是,除非你有正确的Postgres驱动程序版本,否则这不起作用,即使这样,ResultSet也有*all*的字段,而不仅仅是生成的id.

3> anjanb..:

如果您正在使用JDBC 3.0,那么您可以在插入PK后立即获取PK的值.

这是一篇文章,讨论如何:https://www.ibm.com/developerworks/java/library/j-jdbcnew/

Statement stmt = conn.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO authors " +
                   "(first_name, last_name) " +
                   "VALUES ('George', 'Orwell')",
                   Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
    // Retrieve the auto generated key(s).
    int key = rs.getInt(1);
}


请注意,这对Oracle不起作用(我使用的是10g)http://stackoverflow.com/questions/1976625/value-from-last-inserted-row-in-db

4> BalusC..:

因为PostgreSQL JDBC驱动程序版本8.4-701的PreparedStatement#getGeneratedKeys()是终于充分发挥作用.我们在这里用了差不多一年的时间就完全满意了.

在"普通JDBC"中,PreparedStatement需要按如下方式创建它以使其返回键:

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

您可以在此处下载当前的JDBC驱动程序版本(目前仍为8.4-701).



5> svrist..:

postgresql中的序列是事务安全的.所以你可以使用

currval(sequence)

引用:

CURRVAL

返回当前会话中此序列的nextval最近获得的值.(如果在此会话中从未为此序列调用nextval,则会报告错误.)请注意,由于这会返回会话本地值,因此即使其他会话同时执行nextval,它也会提供可预测的答案.


不,这正是currval函数的用途.

6> eflles..:

基于这里的答案,我是如何解决它的:

Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database.
String sql = "INSERT INTO \"TableName\"" +
        "(\"Column1\", \"Column2\",\"Column3\",\"Column4\")" +
        "VALUES ('value1',value2, 'value3', 'value4') RETURNING 
         \"TableName\".\"TableId\"";
PreparedStatement prpState = conn.prepareStatement(sql);
ResultSet rs = prpState.executeQuery();
if(rs.next()){
      System.out.println(rs.getInt(1));
        }

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有