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?的主要内容,如果未能解决你的问题,请参考以下文章

如何也使用 where 条件从表中获取列名

如何使用 CodeIgniter 3 中的外键从表中获取列数据

如何从表中获取最后一个插入 ID

如何从表中获取所有数据,包括表 ID

如何从表中获取字段列表和不同值

如何根据参考值从表中获取数据