mysql - 零到多 : Cannot add or update a child row: a foreign key constraint fails

标签 mysql go go-gorm

我是 Go 和 Gorm 的新手。我想解析 API 响应并存储两个表。 对于每个“reports”表,可以有“personal_details”的零对多表。

但是,gorm 在应用外键约束时报错,因为有时 API 响应中没有 PersonalDetail 的记录。

我遵循了 gorm 文档并尝试了多对多关系,但我认为它不适用于零对多关系

db.Model(&Report{}).AddForeignKey("personal_detail_id", "personal_details(id)", "RESTRICT", "RESTRICT")

type Report struct{
  gorm.Model
  PersonalDetail PersonalDetail `json:"PersonalDetail" gorm:"foreignkey:PersonalDetailId"`
  PersonalDetailId uint
}

type PersonalDetail struct{
  gorm.Model
  Name string `json:"Name"`
  Age string `json:"Age"`

最佳答案

尝试像这样定义你的模型:

type Report struct {
  gorm.Model
  PersonalDetail PersonalDetail `json:"PersonalDetail" gorm:"foreignkey:ReportId"`
}

type PersonalDetail struct {
  gorm.Model
  Name string `json:"Name"`
  Age string `json:"Age"`
  ReportId uint `sql:"type:bigint REFERENCES reports(id) ON DELETE CASCADE"`
}

我在让外键在 GORM 中工作时遇到了一些麻烦,所以我发现使用 SQL 标记来定义关系似乎效果更好。它不是很干净,因为您需要定义实际的数据库名称而不是字段名称,但它可以工作。

还要记住迁移表的顺序。您可能需要按顺序执行此操作,以便不引用尚未创建的表。对于此示例,在 PersonalDetail 之前迁移 Reports

关于mysql - 零到多 : Cannot add or update a child row: a foreign key constraint fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54625825/

相关文章:

go - GORM 中的一对多递归关系

go - 错误reflect.ValueOf(val).IsZero未定义(类型reflect.Value没有字段或方法IsZero

mysql - Cron:将数据从服务导入 MongoDB (Meteor)

go - Docker 在完成 Golang 项目构建之前退出

Gorm Associations BeforeCreate 回调未按预期工作

go - gRPC 可能出现零服务器消息吗?

go - 如何禁止直接结构初始化

python - 出现此错误 "1064 (42000): You have an error in your SQL syntax"

mysql - 使用外键在数据库中重新输入旧数据

php - Laravel 查询生成器原始 AND 语句