# #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;
Затем с помощью строки запроса, если внутри ВСТАВКИ есть ошибка, УЛОВКА выдаст ошибку для обработки.