如何使用GO-MSSQLDB驱动程序获取最后插入的ID?

时间:2018-10-26 05:17:21

标签: sql sql-server go

我发现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

2 个答案:

答案 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()可以完成。