目录

gorm insert 报错 DELETE SET NULL ON UPDATE SET NULL

目录

问题

两张表结构如下,其中 Stu 表中的 SchId 是表的外键, 是 School 表的主键

type School struct{
       SchId    int     `json:"SchId"      gorm:"column:SchId;type:int;size:11;not null;primary_key;AUTO_INCREMENT;"`
    Name      string  `json:"Name"        gorm:"column:Name;type:varchar;size:500;not null;default:'galeone'"`
}
type Stu struct{
    StuId    int     `json:"SchId"      gorm:"column:SchId;type:int;size:11;not null;primary_key;AUTO_INCREMENT;"`
    Name      string  `json:"Name"        gorm:"column:Name;type:varchar;size:500;not null;"`
    SchId    int     `json:"SchId"      gorm:"column:SchId;type:int;size:11;"`
}

在使用 insert 插入时,报错:

func main() {
    addModel := model.Stu{
        StuId: 1111,
        Name:   "******",
    }
    err:=dao.insert(&addModel)
    if err.Error!=nil{
        fmt.Println(err)
    }
}
Error 1452: Cannot add or update a child row: a foreign key constraint fails 
(`ew_nfdas`.`stu`, CONSTRAINT `fk_stud_schid` FOREIGN KEY (`SchId`) REFERENCES `school` (`SchId`) ON DELETE SET NULL ON UPDATE SET NULL) 

插入语句:

INSERT INTO stu (StuId,Name,SchId) VALUES (1111,’******’,0)

由于SchId为外键,0值插入报错不存在

正确的sql:

INSERT INTO stu (StuId,Name) VALUES (1111,’******')

原因:

这是因为 gorm 生成的 insert 语句:

INSERT INTO `stu` (`StuId`,`Name`,`SchId`) VALUES (1111,'******',0)

但是由于 SchId 为外键,0 值插入报错不存在

此时数据库表没有设置外键约束,是可以为 null,因此正常语句:

INSERT INTO `stu` (`StuId`,`Name`) VALUES (1111,'******')

解决

只需要给字段设置默认值即可,也就是当字段是类型零值(0,’’,false)时,会自动使用默认值替换

比如

 SchId    int     `json:"SchId"      gorm:"column:SchId;type:int;size:11;default:1"`

当 SchID 的值为零值 0 时,gorm 会自动用 1 替换

又或者可以用 default:“galeone” 设置默认值为缺省

 SchId    int     `json:"SchId"      gorm:"column:SchId;type:int;size:11;galeone:"`

当 SchID 的值为零值 0 时,gorm 会忽略该字段作为 sql 的条件

比如前面的语句就会变成(该字段被忽略):

INSERT INTO `stu` (`StuId`,`Name`) VALUES (1111,'******')

参考资料: 创建 | GORM - The fantastic ORM library for Golang, aims to be developer friendly. 模型定义 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.