3

我想关闭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"}

有人知道吗?

4

2 回答 2

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
}
于 2020-07-14T22:30:53.033 回答
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 部分。

于 2016-10-21T13:58:46.720 回答