efl*_*les 54 java database postgresql jdbc
有没有办法从最后插入的行中获取值?
我正在插入一个PK将自动增加的行,我想得到这个PK.只有PK才能保证在表中是唯一的.
我正在使用Java和JDBC和PostgreSQL.
Luc*_*c M 57
使用PostgreSQL,您可以通过RETURNING关键字来完成:
INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield
Run Code Online (Sandbox Code Playgroud)
它将返回"anyfield"的值."anyfield"可以是序列与否.
要与JDBC一起使用,请执行以下操作:
ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID");
rs.next();
rs.getInt(1);
Run Code Online (Sandbox Code Playgroud)
And*_*att 28
请参阅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();
Run Code Online (Sandbox Code Playgroud)
anj*_*anb 16
如果您正在使用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);
}
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 11
因为PostgreSQL JDBC驱动程序版本8.4-701的PreparedStatement#getGeneratedKeys()是终于充分发挥作用.我们在这里用了差不多一年的时间就完全满意了.
在"普通JDBC"中,PreparedStatement需要按如下方式创建它以使其返回键:
statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
Run Code Online (Sandbox Code Playgroud)
您可以在此处下载当前的JDBC驱动程序版本(目前仍为8.4-701).
postgresql中的序列是事务安全的.所以你可以使用
currval(sequence)
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)