我有这个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
提前谢谢。
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等的技术术语(