如何在GORM中关闭IDENTITY_INSERT

3
我希望关闭IDENTITY_INSERT,以便在不指定任何ID的情况下使用GORM插入数据。
我尝试了以下方法:
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.)

in 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"}

有人有什么想法吗?

GORM代表什么? - Neo
1
如果您将鼠标悬停在标签上,您会看到:GORM是Grails的对象关系映射(ORM)实现。 - TT.
@TT 哈哈,错过了标记。唉... - Neo
你能把错误信息的其余部分翻译成英文吗? - Neo
1
你真的确定要在ID列上插入显式值吗?当该列明确为IDENTITY列时,身份标识列中的值应由数据库引擎生成,而不是由表示层的您生成。 - TT.
显示剩余4条评论
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
}

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”语句。该语句是用于开启或关闭表中标识列的插入功能。

我在你上面的代码示例中没有看到ON部分,错误明确指出Identity_Insert被设置为关闭。 - Neo
在没有特定ID的情况下插入元素时,必须关闭Identity_Insert。 - sbouaked
不,你必须设置Identity_Insert为On,才能允许在指定标识列的值时进行插入,然后通过将其关闭来禁用它。 包含的代码是在具有标识列的表中插入的正确方式。 - Neo
它也不能与ON值一起使用... :( 出现了相同的错误。 - sbouaked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接