我发现SQL Server
不会自动返回最后插入的ID,我需要使用OUTPUT INSERTED.ID
语句中的SQL insert
手动进行操作。
稍后我如何在Go code
中捡起它?
有问题的功能是:
func (sta *state) mkLogEntry(from time.Time, to time.Time, man bool) (id int64) {
qry := "INSERT INTO ROMEExportLog(FromDate,ToDate,ExecutedAt,ExecutedManually,ExportWasSuccessful,UpdatedDaysIrregular) OUTPUT INSERTED.ID " +
"VALUES(@FromDate,@ToDate,@ExecutedAt,@ExecutedManually,@ExportWasSuccessful,@UpdatedDaysIrregular)"
res, err := sta.db.Exec(qry,
sql.Named("FromDate", from),
sql.Named("ToDate", to),
sql.Named("ExecutedAt", time.Now()),
sql.Named("ExecutedManually", man),
sql.Named("ExportWasSuccessful", false),
sql.Named("UpdatedDaysIrregular", false),
)
if err != nil {
log.Fatal(err)
}
id, err = res.LastInsertId()
if err != nil {
log.Fatal(err)
}
return
}
res.LastInsertId()
返回There is no generated identity value
。
答案 0 :(得分:1)
其原因是因为PostgreSQL没有返回您最后插入的ID。这是因为只有在使用序列的表中创建新行时,最后插入的ID才可用。
如果实际上是在分配了序列的表中插入一行,则必须使用RETURNING子句。像这样的东西:INSERT INTO table (name) VALUES("val") RETURNING id
。
我不确定您的驱动程序,但是在pq中,您将通过以下方式进行操作:
lastInsertId := 0
err = db.QueryRow("INSERT INTO brands (name) VALUES($1) RETURNING id", name).Scan(&lastInsertId)
答案 1 :(得分:0)
对于SQL SERVER:
这可能有点花哨...但是我发现使用QueryRow
将运行多个查询/命令,并仅返回 LAST 行。
if err := db.QueryRow(`
INSERT INTO [TABLE] ([COLUMN]) VALUES (?);
SELECT SCOPE_IDENTITY()`,
colValue
).Scan(&id); err != nil {
panic(err)
}
只要SELECT SCOPE_IDENTITY()
是返回的最后一行,那么这基本上可以达到我期望的结果。LastInsertId()可以完成。