Golang:如何使用创建触发器从表中获取 LastInsertId?
Posted
技术标签:
【中文标题】Golang:如何使用创建触发器从表中获取 LastInsertId?【英文标题】:Golang: How to get LastInsertId from table with a create trigger? 【发布时间】:2022-01-10 03:24:57 【问题描述】:尝试从具有 INSERT/UPDATE 触发器的表中获取 AUTO_INCREMENT id 到“更改”表中。最初我的代码是标准模式:
stmt, err := db.Prepare("INSERT table SET name=?")
res, err := stmt.Exec(name)
lid, err := res.LastInsertId()
但是表上的 TRIGGER 导致 LastInsertId 从更改表返回 ID,而不是插入表中的新记录。
现在我发现我可以调整我的查询以返回 SCOPE_IDENTITY 并且似乎正确返回了插入的 ID,这里的问题是如果 INSERT 失败,那么 SCOPE_IDENTITY 将返回 NULL 并且 Scan() 将尝试将 NULL 值插入 INT64 变量。哪个本身就是价值的简单处理......我遇到的问题是INSERT上的错误是什么?我似乎无法获得导致 INSERT 失败的错误值,因此我可以正确记录问题并优雅地将错误传回以进行更正。
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(&lid)
我尝试过使用事务,但是在 INSERT 完成的那一刻,SCOPE 关闭并且事务中的下一个查询仍然返回 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;
然后使用QueryRow,如果INSERT中有错误,CATCH会抛出错误进行处理。
【讨论】:
以上是关于Golang:如何使用创建触发器从表中获取 LastInsertId?的主要内容,如果未能解决你的问题,请参考以下文章