Как получить значение от последней вставленной строки? [дубликат]

Просто подумал, что я брошу это в:

function inArray(val, ary){
  for(var i=0,l=ary.length; i<l; i++){
    if(ary[i] === val){
      return true;
    }
  }
  return false;
}
function removeClassName(classNameS, fromElement){
  var x = classNameS.split(/\s/), s = fromElement.className.split(/\s/), r = [];
  for(var i=0,l=s.length; i<l; i++){
    if(!iA(s[i], x))r.push(s[i]);
  }
  fromElement.className = r.join(' ');
}
function addClassName(classNameS, toElement){
  var s = toElement.className.split(/\s/);
  s.push(c); toElement.className = s.join(' ');
}
54
задан eflles 27 October 2008 в 18:42
поделиться

8 ответов

С PostgreSQL можно сделать это через ключевое слово ВОЗВРАТА:

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);
57
ответ дан Bastian Voigt 7 November 2019 в 17:47
поделиться

Не используйте SELECT currval('MySequence') - значение увеличивается при неудачных вставках.

0
ответ дан 7 November 2019 в 07:47
поделиться

Начиная с версии драйвера PostgreSQL JDBC 8.4-701 , PreparedStatement # getGeneratedKeys () , наконец, полностью функционально. Мы используем его в производстве почти год к нашему полному удовлетворению.

В «обычном JDBC» PreparedStatement необходимо создать, как показано ниже, чтобы он возвращал ключи:

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

Вы можете загрузить текущую версию драйвера JDBC здесь (которая стоит на данный момент еще 8.4-701).

11
ответ дан 7 November 2019 в 07:47
поделиться

Если Вы используете 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);
}
16
ответ дан anjanb 7 November 2019 в 17:47
поделиться

Используйте последовательности в пост-ГРЭС для идентификационных столбцов:

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

SELECT currval('MySequence');

currval возвратит текущее значение последовательности на той же сессии.

(В SQL MS, Вы использовали бы @@ идентификационные данные или SCOPE_IDENTITY ())

1
ответ дан BradC 7 November 2019 в 17:47
поделиться

Последовательности в postgresql являются безопасной транзакцией. Таким образом, можно использовать

currval(sequence)

Кавычка:

Возврат currval

значение последний раз получено nextval для этой последовательности на текущей сессии. (Об ошибке сообщают, если nextval никогда не называли для этой последовательности на этой сессии.) Замечают, что, потому что это возвращает локальное для сессии значение, оно дает предсказуемый ответ, даже если другие сессии выполняют nextval между тем.

8
ответ дан svrist 7 November 2019 в 17:47
поделиться

См. документы API для java.sql. Оператор .

В основном, когда Вы звоните executeUpdate() или executeQuery(), используйте Statement.RETURN_GENERATED_KEYS постоянный. Можно тогда звонить getGeneratedKeys для получения автоматически сгенерированных ключей всех строк, созданных тем выполнением. (Принятие Вашего драйвера JDBC обеспечивает его.)

Это идет что-то вроде этого:

Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
28
ответ дан Andrew Watt 7 November 2019 в 17:47
поделиться

Вот то, как я решил его, на основе ответов здесь:

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
ответ дан eflles 7 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: