Golang: Как получить lastInsertId из таблицы с помощью триггера создания?

# #sql #sql-server #go #auto-increment

#sql #sql-сервер #Вперед #автоматическое увеличение

Вопрос:

Попытка получить идентификатор AUTO_INCREMENT из таблицы, в которой есть триггер ВСТАВКИ/ОБНОВЛЕНИЯ, в таблицу «изменения». Изначально мой код был стандартным шаблоном:

 stmt, err := db.Prepare("INSERT table SET name=?") res, err := stmt.Exec(name) lid, err := res.LastInsertId()  

Но ТРИГГЕР в таблице приводил к тому, что lastInsertId возвращал идентификатор из таблицы изменений, а не новую запись в таблице вставки.

Теперь я обнаружил, что могу настроить свой запрос, чтобы вместо этого возвращать идентификатор области видимости, и это, казалось, правильно возвращало вставляемый идентификатор, проблема здесь заключалась в том, что если ВСТАВКА не удалась, то идентификатор области видимости вернет значение NULL, а функция Scan() попытается вставить значение NULL в переменную INT64. Что само по себе является простым описанием значения… проблема, с которой я столкнулся, заключается в том, что была ошибка при ВСТАВКЕ? Кажется, я не могу определить значение ошибки, из-за которой произошла ошибка ВСТАВКИ, чтобы я мог правильно зарегистрировать проблему и изящно передать ошибку обратно для исправления.

 stmt, err := db.Prepare("INSERT table SET name=?; SELECT SCOPE_IDENTITY as last_insert_id") res, err := stmt.QueryRow(name)  var lid int64 err := res.Scan(amp;lid)  

Я пробовал использовать транзакцию, но в момент завершения ВСТАВКИ ОБЛАСТЬ закрывается, а следующий запрос в транзакции по-прежнему возвращает значение NULL.

Ответ №1:

Поэтому я нашел обходной путь, используя инструкцию TRY CATCH TSQL.

 BEGIN TRY   INSERT table SET name=?;   SELECT SCOPE_IDENTITY() as last_insert_id;  END TRY   BEGIN CATCH   THROW;  END CATCH;  

Затем с помощью строки запроса, если внутри ВСТАВКИ есть ошибка, УЛОВКА выдаст ошибку для обработки.