Informix: как получить идентификатор последней вставленной записи

StackOverflow https://stackoverflow.com/questions/246983

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Я видел, как это использовалось.

if LOCAL_SQLCA^.sqlcode = 0 then
/ return serial */
  Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
  Result := -(Abs(LOCAL_SQLCA^.sqlcode));

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top