Informix: как получить идентификатор последней вставленной записи - PullRequest
2 голосов
/ 29 октября 2008

Какой самый эффективный способ получить значение столбца SERIAL после оператора INSERT? То есть Я ищу способ репликации @@IDENTITY или SCOPE_IDENTITY функциональных возможностей MS SQL

Ответы [ 4 ]

10 голосов
/ 31 октября 2008

Значение последней вставки SERIAL сохраняется в записи SQLCA, как вторая запись в массиве sqlerrd. Ответ Брайана верен для ESQL / C, но вы не упомянули, какой язык вы используете.

Если вы пишете хранимую процедуру, значение можно найти следующим образом:

LET new_id = DBINFO('sqlca.sqlerrd1');

Также можно найти в $sth->{ix_sqlerrd}[1] при использовании DBI

Существуют варианты для других языков / интерфейсов, но я уверен, что вы поймете идею.

1 голос
/ 29 октября 2008

Я видел это использованным.

if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
  Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
  Result := -(Abs(LOCAL_SQLCA^.sqlcode));
0 голосов
/ 23 января 2010

В ОП не указано, какая версия Informix используется, поэтому могут быть разные ответы

0 голосов
/ 30 октября 2008

Я не думаю, что слово "эффективный" - это то слово, которое вы ищете здесь. Это больше вопрос точности. Я не уверен, что смогу объяснить это лучше, чем SQL Books Online, но обычно, если вы действительно не знаете, что делаете и у вас нет конкретной причины для использования @@ IDENTITY, используйте SCOPE_IDENTITY. Наиболее очевидная причина этого заключается в том, что @@ IDENTITY не возвращает идентификатор последней записи, добавленной вашей программой / sp / etc, если к таблице прикреплен триггер. Кроме того, могут возникнуть проблемы в приложениях большого объема, в которых одновременно происходят две транзакции и происходит следующее ...

  1. Ваша вставка
  2. Вставка другого пользователя
  3. Вернуть вам личность другого пользователя
...