我正在使用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/