猿问

远程数据库和 SQL 服务器:自动递增不起作用

我正在尝试使用 GORM 将新值插入到我的 SQL 服务器表中。但是,它不断返回错误。您可以在下面找到详细示例:


type MyStructure struct {

    ID                     int32                    `gorm:"primaryKey;autoIncrement:true"`

    SomeFlag               bool                     `gorm:"not null"`

    Name                   string                   `gorm:"type:varchar(60)"`

}

执行以下代码(在事务内创建)


myStruct := MyStructure{SomeFlag: true, Name: "XYZ"}


result = tx.Create(&myStruct)

    if result.Error != nil {

        return result.Error

    }

导致以下错误:


无法将值 NULL 插入到列“ID”、表“dbo”中。我的结构';列不允许空值。插入失败


然后,由 GORM 生成的 SQL 查询如下所示:


INSERT INTO "MyStructures" ("SomeFlag","Name") OUTPUT INSERTED."ID" VALUES (1, 'XYZ')

另一方面,直接在数据库连接上执行创建(不使用事务)会导致以下错误:


表“我的结构”没有标识属性。无法执行 SET 操作


然后,由 GORM 生成的 SQL 查询如下所示:


SET IDENTITY_INSERT "MyStructures" ON;INSERT INTO "MyStructures" ("SomeFlag", "Name") OUTPUT INSERTED."ID" VALUES (1, 'XYZ');SET IDENTITY_INSERT "MyStructures" OFF;

在这种情况下,如何使自动递增工作?为什么我会收到两个不同的错误,具体取决于它是内部交易还是外部交易?


侃侃无极
浏览 312回答 3
3回答

慕哥6287543

我在戈尔姆的问题中发现了这一点:gorm.DefaultCallback.Create().Remove("mssql:set_identity_insert")https://github.com/go-gorm/gorm/issues/941#issuecomment-250267125

一只甜甜圈

嵌入 gorm 总是更好。默认情况下提供字段的结构中的模型:ID、创建时、更新时、已删除。默认情况下,ID 将是主键,并且它是自动递增的(由 GORM 管理)type MyStructure struct {    gorm.Model    SomeFlag               bool                     `gorm:"not null"`    Name                   string                   `gorm:"type:varchar(60)"`}删除现有表:并再次创建表:,然后尝试插入记录。db.Migrator().DropTable(&MyStructure{})db.AutoMigrate(&MyStructure{})

海绵宝宝撒

只需更换您的结构type MyStructure struct {    ID                     int32                    `gorm:"primaryKey;autoIncrement:true"`    SomeFlag               bool                     `gorm:"not null"`    Name                   string                   `gorm:"type:varchar(60)"`}与此type MyStructure struct {    ID                     int32                    `gorm:"AUTO_INCREMENT;PRIMARY_KEY;not null"`    SomeFlag               bool                     `gorm:"not null"`    Name                   string                   `gorm:"type:varchar(60)"`}
随时随地看视频慕课网APP

相关分类

Go
我要回答