Informix: как получить идентификатор последней вставленной записи
Вопрос
Какой самый эффективный способ получения значения столбца 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 используется, поэтому могут быть разные ответы