我有這個 MySQL 資料庫,我需要在其中使用 go 程式添加記錄,并且需要檢索最后添加的記錄的 id,以將 id 添加到另一個表中。
當我INSERT INTO table1 values("test",1); SELECT LAST_INSERT_ID()在 MySQL Workbench 中運行 insert時,它回傳最后一個 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
先感謝您。
uj5u.com熱心網友回復:
MySQL 協議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 等的技術術語。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387375.html
上一篇:從sql得到錯誤的答案
下一篇:Sqlite無回圈檢查類別
