有没有办法从最后插入的行中获取值?
我正在插入一个PK将自动增加的行,我想得到这个PK.只有PK才能保证在表中是唯一的.
我正在使用Java和JDBC和PostgreSQL.
使用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);
请参阅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();
如果您正在使用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); }
因为PostgreSQL JDBC驱动程序版本8.4-701的PreparedStatement#getGeneratedKeys()
是终于充分发挥作用.我们在这里用了差不多一年的时间就完全满意了.
在"普通JDBC"中,PreparedStatement
需要按如下方式创建它以使其返回键:
statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
您可以在此处下载当前的JDBC驱动程序版本(目前仍为8.4-701).
postgresql中的序列是事务安全的.所以你可以使用
currval(sequence)
引用:
CURRVAL
返回当前会话中此序列的nextval最近获得的值.(如果在此会话中从未为此序列调用nextval,则会报告错误.)请注意,由于这会返回会话本地值,因此即使其他会话同时执行nextval,它也会提供可预测的答案.
基于这里的答案,我是如何解决它的:
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)); }