如何为GORM关闭IDENTITY_INSERT

时间:2016-10-21 13:40:41

标签: sql-server go go-gorm

我想关闭IDENTITY_INSERT以使用GORM插入数据而不指定任何ID。

我试试这个:

func main() {

    db, err := gorm.Open("mssql", "...")

    //...
    db.DropTable(&User{})
    db.CreateTable(&User{})
    db.Exec("SET IDENTITY_INSERT users OFF;") <-- this doesn't work

    for _, user := range users {
        db.Create(&user)
    }

}

type User struct {
    ID        uint
    UserName  string
    FirstName string
    LastName  string
}

var users []User = []User{
    User{UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"},
    User{UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"},
    User{UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"},
}

编辑:

数据不是在数据库中创建的,我有以下错误(抱歉用法语):

(mssql: Une valeur explicite doit être spécifiée dans la colonne d'identité de la table 'users' quand IDENTITY_INSERT est défini à ON, ou qu'un utilisateur de la réplication effectue une insertion dans une colonne d'identité NOT FOR REPLICATION.)

在en:

Cannot insert explicit value for identity column in table 'users' when IDENTITY_INSERT is set to OFF."

如果我添加ID值,程序会起作用:

User{ID: 1, UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"}

有人有任何想法吗?

2 个答案:

答案 0 :(得分:1)

您必须使用交易

tx := db.Begin()
if err := tx.Exec("SET IDENTITY_INSERT users OFF;").Error; err != nil {
    return err
}
if err := tx.Commit().Error; err != nil {
    return err
}

答案 1 :(得分:0)

如果您真的需要这样做,并且极少数情况下您需要启用此功能(设置标识列的值),如此

Set Identity_Insert dbo.users On
Insert Into users (YOURIDENTITYCOLUMN, NAME)
Values(1, 'your value')
Set Identity_Insert dbo.users Off

如果您没有尝试设置标识列的值,请从查询中删除语句SET Identity_Insert dbo.users Off部分。