外键为零(而不是空),导致MySQL中的go-gorm出现错误1452

f8rj6qna  于 2023-01-18  发布在  Go
关注(0)|答案(1)|浏览(145)

所以我有两个表是零对多关系(每个File最多可以有1个User)。

type User struct {
    gorm.Model
}

以及

type File struct {
    gorm.Model
    UserID      int    `gorm:"default:null"`
    User        User   `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:UserID"`
}

现在,在MySQL中(SQLite不会出现这个问题),如果没有创建用户,并且我使用空用户更新文件,则会收到以下错误:

Error 1452: Cannot add or update a child row: a foreign key constraint fails (`DB`.`files`, CONSTRAINT `fk_files_creator` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)
UPDATE `files` SET `user_id`=0,`deleted_at`=NULL WHERE `id` = 5

这是因为它试图将“0”添加为user_id,而实际上它应该是NULL
UPDATEfilesSETuser_id=NULL,deleted_at=NULL WHEREid= 5
我设法修复了使用default:null创建的问题,但是有没有什么想法也可以用于更新?谢谢!

0qx6xfy6

0qx6xfy61#

您可以将指针(*)用于可空值:

type File struct {
    gorm.Model
    UserID      *int    
    User        *User   `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:UserID"`
}

实现零对多关系需要类似于list s的东西。

type User struct {
    gorm.Model
    Files []File `json:"partList" gorm:"many2many:files_relation_table;"`
}

相关问题