去 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 等)
我有这个 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 等)