sql-server - 使用GORM在同一张表上设置两个外键时,MS-SQL服务器引发错误

标签 sql-server database go go-gorm

我正在使用GORM进行数据库迁移。因此,我定义了结构并通过GORM的AutoMigrate函数运行它们。

    type Person struct {
        ID          string    `gorm:"type:varchar(36);primary_key"`
    }

    err := db.Table("persons").AutoMigrate(&Person{}).Error

    type Address struct {
        ID         string      `gorm:"type:varchar(36);primary_key"`
        PersonID   string      `gorm:"column:person_id;type:varchar(36);NOT NULL"`
    }

    err = db.AutoMigrate(&Address{}).Error

    err = db.Model(&Address{}).AddForeignKey("person_id", "persons(id)", "NO ACTION", "CASCADE").Error

    type Contact struct {
        ID            string      `gorm:"type:varchar(36);primary_key"`
        AddressID     null.String `gorm:"column:address_id;type:varchar(36);NOT NULL"`
        PersonID      string      `gorm:"column:person_id;type:varchar(36);NOT NULL"`
    }

    err = db.AutoMigrate(&Contact{}).Error

    err = db.Model(&Contact{}).AddForeignKey("address_id", "addresses(id)", "NO ACTION", "CASCADE").Error

    err = db.Model(&Contact{}).AddForeignKey("person_id", "persons(id)", "NO ACTION", "CASCADE").Error

在上面的代码中,Contacts表上对AddForeignKey函数的第二次调用给出了错误:
mssql: Could not create constraint or index. See previous errors.

即使将person_id外键移到address_id外键上方,address_id外键也会失败。

我正在使用最新的docker容器设置(microsoft / mssql-server-linux:latest)运行MS-SQL服务器。这与约束的命名有关吗?如果是,那么如何使用GORM进行设置? My-SQL一切正常。

如果有解决方案,那将非常有帮助。我无法运行原始查询。只能使用GORM进行迁移。

谢谢

最佳答案

多个外键在同一表上不能有“无操作”,“级联”。如果您不执行任何操作,则您将无法执行任何操作,但是您必须处理删除和更新您的自我。我通常要做的是打开logmode并将log sql语句复制粘贴到SQL中。这将给您一个更清晰的错误。

关于sql-server - 使用GORM在同一张表上设置两个外键时,MS-SQL服务器引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60671416/

相关文章:

php - 在规范化数据库模式中访问数据的最佳方式是什么?

MYSQL 选择其中 SUM()

Go信号处理

mongodb - 如何使用 mongo-go-driver 编码/解码具有多态结构的 bson 数组

mysql - 其他 RDBMS(非 SQL Server)中 OUTER APPLY 的模拟

sql-server - 执行存储过程时使用函数作为参数?

sql - TSQL - 无效的列名行号

sql - 从电影数据库中检索数据

interface - 可以在结构中嵌入结构以满足接口(interface)吗

c# - con.Open() 失败异常 具有 IsolationLevel 快照的事务无法提升