【问题标题】:How to turn OFF IDENTITY_INSERT for GORM如何为 GORM 关闭 IDENTITY_INSERT
【发布时间】:2017-03-03 20:35:04
【问题描述】:

我想关闭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.)

在中:

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 代表什么?
  • @MisterPositive 如果您将鼠标悬停在标签上,您将看到:GORM is Grails' object relational mapping (ORM) implementation.
  • @TT LOL,错过了标志。呃……
  • 当 ID 列明显是 IDENTITY 列时,您确定要为该列插入显式值吗?标识列中的值应该由数据库引擎生成,而不是由您在表示层生成。

标签: sql-server go go-gorm


【解决方案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
}

【讨论】:

    【解决方案2】:

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

    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 设置为关闭。
    • 跟随 msdn.microsoft.com/fr-fr/library/ms188059.aspx Identity_Insert 必须关闭才能插入没有特定 ID 的元素
    • 否 - 您必须将 Identity_Insert On 设置为允许在要为标识列指定值的位置插入,然后通过将其关闭来禁用它。包含的代码是插入带有标识列的表的正确方法
    • 它不适用于 ON 值.. :( 有同样的错误
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2010-11-17
    • 2011-10-27
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多