去 mysql LAST_INSERT_ID() returns 0

go mysql LAST_INSERT_ID() returns 0

我有这个 MySQL 数据库,我需要在其中使用 go 程序添加记录,并且需要检索最后添加的记录的 ID,以将该 ID 添加到另一个 table。

当我 运行 在 MySQL Workbench 中插入 INSERT INTO table1 values("test",1); SELECT LAST_INSERT_ID() 时,它 returns 最后一个 ID,它是自动递增的,没有问题。

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


    _, 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),效果非常好;转到 returns 实际 ID。

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

我是 go 的新手,所以如果我犯了愚蠢的 go 错误导致了这个错误,请不要对我太苛刻 :D

提前致谢。

MySQL 协议 returns LAST_INSERT_ID() 值在其对 INSERT 语句的响应中。并且,golang 驱动程序公开了该返回值。因此,您不需要额外的往返行程即可获得它。这些 ID 值通常是无符号的 64 位整数。

尝试这样的事情。

    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不成功,你必须将最后一个插入ID值视为不可预测。(这是“垃圾”的技术术语,垃圾,垃圾、basura 等)