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.