go mysql LAST_INSERT_ID() returns 0



我有这个MySQL数据库,我需要用go程序添加记录,并需要检索最后添加的记录的id,以将id添加到另一个表中。

当我在MySQL Workbench中运行insertINSERT INTO table1 values("test",1); SELECT LAST_INSERT_ID()时,它会返回最后一个id,该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),它工作得非常好;go返回实际id。

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

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

提前谢谢。

MySQL协议在对INSERT语句的响应中返回LAST_INSERT_ID()值。并且,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等的技术术语(

最新更新