Внешний ключ равен нулю (вместо null), вызывая ошибку 1452 в MySQL для go-gorm

#mysql #go #go-gorm

#mysql #Вперед #go-gorm

Вопрос:

итак, у меня есть 2 таблицы в отношении ноль ко многим. (Каждый 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 . Вот так:

UPDATE `files` SET `user_id`=NULL,`deleted_at`=NULL WHERE `id` = 5

Мне удалось исправить это для создания using default:null , но есть идеи, как это сделать и для обновления? Спасибо!

Ответ №1:

Вы можете использовать pointers ( * ) для обнуляемых значений:

 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;"`
}