Как получить значение из последней вставленной строки?
Есть ли способ получить значение из последней вставленной строки?
Я вставляю строку, где ПК будет автоматически увеличиваться, и я хотел бы получить этот ПК. Только ПК гарантированно будет уникальным в таблице.
Я использую Java с JDBC и PostgreSQL.
Ответы
Ответ 1
С PostgreSQL вы можете сделать это с помощью ключевого слова RETURNING:
PostgresSQL - ВОЗВРАЩЕНИЕ
INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield
Он вернет значение "anyfield". "любое поле" может быть последовательностью или нет.
Чтобы использовать его с JDBC, выполните следующие действия:
ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID");
rs.next();
rs.getInt(1);
Ответ 2
Смотрите документы API для java.sql.Statement.
В основном, когда вы вызываете executeUpdate()
или executeQuery()
, используйте константу Statement.RETURN_GENERATED_KEYS
. Затем вы можете вызвать getGeneratedKeys
, чтобы получить автоматически сгенерированные ключи всех строк, созданных этим исполнением. (Предположим, что драйвер JDBC предоставляет его.)
Он идет по строкам:
Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
Ответ 3
Если вы используете 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);
}
Ответ 4
Так как версия драйвера PostgreSQL JDBC 8.4-701 PreparedStatement#getGeneratedKeys()
, наконец, полностью функционально. Мы используем его здесь почти год в производстве для нашего полного удовлетворения.
В "plain JDBC" PreparedStatement
необходимо создать следующим образом, чтобы вернуть ключи:
statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
Вы можете скачать текущую версию драйвера JDBC здесь (на данный момент это еще 8.4-701).
Ответ 5
Последовательности в postgresql являются безопасными транзакциями. Таким образом, вы можете использовать
currval(sequence)
Цитата:
CURRVAL
Возвращает последнее значение, полученное последним для этой последовательности в текущей сессии. (Ошибка сообщил, что если nextval никогда не был вызвал эту последовательность в этом сессии.) Обратите внимание, что поскольку это возвращает локальное значение сеанса, оно дает предсказуемый ответ, даже если другие сеансы выполняются nextval Между тем.
Ответ 6
Вот как я решил это, основываясь на ответах здесь:
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));
}
Ответ 7
Если вы используете 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);
Ответ 8
Использовать последовательности в столбцах postgres для id:
INSERT mytable(myid) VALUES (nextval('MySequence'));
SELECT currval('MySequence');
currval вернет текущее значение последовательности в тот же сеанс.
(В MS SQL вы должны использовать идентификатор @@или SCOPE_IDENTITY())
Ответ 9
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();
Ответ 10
Не используйте SELECT currval ('MySequence') - значение увеличивается на вставках, которые терпят неудачу.
Ответ 11
Для MyBatis 3.0.4 с помощью аннотаций и драйвера Postgresql 9.0-801.jdbc4 вы определяете метод интерфейса в вашем Mapper, например
public interface ObjectiveMapper {
@Select("insert into objectives" +
" (code,title,description) values" +
" (#{code}, #{title}, #{description}) returning id")
int insert(Objective anObjective);
Обратите внимание, что вместо @Insert используется @Select.
Ответ 12
например:
Connection conn = null;
PreparedStatement sth = null;
ResultSet rs =null;
try {
conn = delegate.getConnection();
sth = conn.prepareStatement(INSERT_SQL);
sth.setString(1, pais.getNombre());
sth.executeUpdate();
rs=sth.getGeneratedKeys();
if(rs.next()){
Integer id = (Integer) rs.getInt(1);
pais.setId(id);
}
}
с ,Statement.RETURN_GENERATED_KEYS);"
не найдено.
Ответ 13
Используйте этот простой код:
// 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)
Ответ 14
Если вы находитесь в транзакции, вы можете использовать SELECT lastval()
после вставки, чтобы получить последний сгенерированный идентификатор.