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

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

我在插入一行PK的地方会自动增加,我想得到这个PK。 只有PK保证在表中是唯一的。

我正在使用JDBC和PostgreSQL的Java。

有了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来获取由该执行创build的所有行的自动生成的键。 (假设您的JDBC驱动程序提供它。)

它沿着这样的方向走:

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

如果您使用的是JDBC 3.0,那么只要插入它就可以获得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需要按如下方式创build,以使其返回键:

 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)); } 

如果您使用的是Statement ,请进行以下操作

 //MY_NUMBER is the column name in the database String generatedColumns[] = {"MY_NUMBER"}; Statement stmt = conn.createStatement(); //String sql holds the insert query stmt.executeUpdate(sql, generatedColumns); ResultSet rs = stmt.getGeneratedKeys(); // The generated id if(rs.next()) long key = rs.getLong(1); 

如果您正在使用PreparedStatement ,请执行以下操作

 String generatedColumns[] = {"MY_NUMBER"}; PreparedStatement pstmt = conn.prepareStatement(sql,generatedColumns); pstmt.setString(1, "qwerty"); pstmt.execute(); ResultSet rs = pstmt.getGeneratedKeys(); if(rs.next()) long key = rs.getLong(1); 

在postgres中为id列使用序列:

 INSERT mytable(myid) VALUES (nextval('MySequence')); SELECT currval('MySequence'); 

currval将在同一个会话中返回序列的当前值。

(在MS SQL中,您将使用@@ identity或SCOPE_IDENTITY())

 PreparedStatement stmt = getConnection(PROJECTDB + 2) .prepareStatement("INSERT INTO fonts (font_size) VALUES(?) RETURNING fonts.*"); stmt.setString(1, "986"); ResultSet res = stmt.executeQuery(); while (res.next()) { System.out.println("Generated key: " + res.getLong(1)); System.out.println("Generated key: " + res.getInt(2)); System.out.println("Generated key: " + res.getInt(3)); } stmt.close(); 

不要使用SELECT currval('MySequence') – 在插入失败时,值增加。

对于具有批注和Postgresql驱动程序9.0-801.jdbc4的MyBatis 3.0.4,您可以在Mapper中定义一个接口方法

 public interface ObjectiveMapper { @Select("insert into objectives" + " (code,title,description) values" + " (#{code}, #{title}, #{description}) returning id") int insert(Objective anObjective); 

请注意,使用@Select而不是@Insert。

例如:

 连接conn = null;
             PreparedStatement sth = null;
             ResultSet rs = null;
            尝试{
                 conn = delegate.getConnection();
                 sth = conn.prepareStatement(INSERT_SQL);
                 sth.setString(1,pais.getNombre());
                 sth.executeUpdate();
                 RS = sth.getGeneratedKeys();
                如果(rs.next()){
                    整数id =(整数)rs.getInt(1);
                     pais.setId(ID);
                 }
             } 

,Statement.RETURN_GENERATED_KEYS);"没有find。

使用这个简单的代码:

 // Do your insert code myDataBase.execSQL("INSERT INTO TABLE_NAME (FIELD_NAME1,FIELD_NAME2,...)VALUES (VALUE1,VALUE2,...)"); // Use the sqlite function "last_insert_rowid" Cursor last_id_inserted = yourBD.rawQuery("SELECT last_insert_rowid()", null); // Retrieve data from cursor. last_id_inserted.moveToFirst(); // Don't forget that! ultimo_id = last_id_inserted.getLong(0); // For Java, the result is returned on Long type (64) 

如果你在一个事务中,你可以在插入后使用SELECT lastval()来得到最后生成的id。