首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >go mysql LAST_INSERT_ID()返回0

go mysql LAST_INSERT_ID()返回0
EN

Stack Overflow用户
提问于 2021-12-20 11:45:02
回答 1查看 775关注 0票数 1

我有一个MySQL数据库,在该数据库中,我需要添加带有go程序的记录,并需要检索上次添加的记录的id,以便将id添加到另一个表中。

当我在MySQL工作台中运行insert MySQL时,它返回最后一个id,该id自动递增,没有任何问题。

但是,如果我运行go代码,它总是打印0。守则:

代码语言:javascript
运行
复制
    _, err := db_client.DBClient.Query("insert into table1 values(?,?)", name, 1)
    var id string
    err = db_client.DBClient.QueryRow("SELECT LAST_INSERT_ID()").Scan(&id)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("id: ", id)

我尝试了这个变体来进一步缩小问题的范围:err = db_client.DBClient.QueryRow("SELECT id from table1 where name=\"pleasejustwork\";").Scan(&id),它工作得非常好;go返回实际的id。

为什么它不能使用LAST_INSERT_ID()?

我是个新手,所以如果我犯了导致这个错误的愚蠢的围棋错误,请不要对我太严厉。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-20 12:31:24

MySQL协议在对INSERT语句的响应中返回LAST_INSERT_ID()值。并且,golang驱动程序公开返回的值。所以,你不需要额外的往返来得到它。这些ID值通常是无符号64位整数.

试试这样的东西。

代码语言:javascript
运行
复制
    res, err := db_client.DBClient.Exec("insert into table1 values(?,?)", name, 1)
     if err != nil {
        panic (err.Error())
    }
    id, err := res.LastInsertId()
    if err != nil {
        panic (err.Error())
    }
    fmt.Println("id: ", id)

我承认我不知道为什么你的代码不起作用。每当您成功地发出单行INSERT语句时,同一数据库连接上的下一条语句始终可以访问有用的LAST_INSERT_ID()值。无论是否使用显式事务,这都是正确的。

但是,如果INSERT不成功,则必须将最后一个insert ID值视为不可预测的。(这是“垃圾”、“巴苏拉”等的术语)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70421288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档