[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fVVjn7H3QBLMft7tRkDnFBaMFWbwP8mmEG2ebTvSK3bQ":3},{"code":4,"message":5,"data":6},200,"成功",{"id":7,"createdAt":8,"title":9,"content":10,"summary":11,"image":12,"uid":13,"user":14,"categoryId":21,"category":22,"subCategoryId":24,"subCategory":25,"comments":27,"status":17,"reason":28,"notice":28,"visitCount":29,"commentCount":30,"keywords":31},3,"2024-01-06T14:15:30.146Z","gorm [rows 2]INSERT INTO user_info xxx ON DUPLICATE KEY UPDATE uid=VALUES(uid)","# 问题描述\n在使用gorm插入数据时，有2张表是关联的，两张表分别是User和UserInfo表，而User和UserInfo是HasOne关联关系。\n\n在插入User一条数据时，会关联生成一条UserInfo记录。\n\n在插入第一条User记录时，会关联创建一条UserInfo记录，在第一条数据时没有问题。\n\n当插入第二条User记录时，发现User的新记录创建是成功的，但是UserInfo表中仍然只有一条数据，而且第二条UserInfo记录覆盖了第一条。\n\n2023/11/26 21:04:57 /Users/xxx/controller/user/user.go:88\n[27.498ms] [rows:2] INSERT INTO user_info (created_at,updated_at,deleted_at,uid,name,token,sign,birthday,is_admin,is_ban,ban_message,is_robot,last_login_time) VALUES ('2023-11-26 21:04:57.274','2023-11-26 21:04:57.274',NULL,486881260xxxxxx,'','eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjEzMTIxMTcxOTk4IiwiZXhwIjo0ODU0NjAzODk3LCJuYmYiOjE3MDEwMDM4OTcsImlhdCI6MTcwMTAwMzg5N30.UprJeW_hr8GNgYl8YhbvRlcIdE9zyc0hzmZqtnZ3dmI','',NULL,0,0,'',0,NULL) ON DUPLICATE KEY UPDATE uid=VALUES(uid)\n\n2023/11/26 21:04:57 /Users/xxx/controller/user/user.go:88\n[55.255ms] [rows:1] INSERT INTO user (created_at,updated_at,deleted_at,user_id,phone,nick_name,avatar,vip_type) VALUES ('2023-11-26 21:04:57.247','2023-11-26 21:04:57.247',NULL,486881260xxxxxx,'1312117xxxx','用户486881260527685','',1)\n\n# 问题截图\n![](https://image.xinwei.ltd/image_11704550303976.png)\n\n当使用Deug()来查看gorm输出，从截图中可以看出，在插入第2条UserInfo记录的时候，影响到了2条记录。在用Workbench中查看数据库时，发现只有一条记录。\n\n# 问题思路分析\n1. 首先检查insert语句，分析user记录关联的userinfo记录，比第一次插入时的userinfo记录的区别，结果没有任何发现，都是正常的。\n![](https://image.xinwei.ltd/image_21704550352210.png)\n\n2. 其次在insert的时候使用Omit掉userInfo字段，不让user记录来关联插入UserInfo记录，在insert了user记录后，再insert一下UserInfo记录，看是否userInfo记录还会被覆盖掉。\n![](https://image.xinwei.ltd/image_31704550381963.png)\n结果是userinfo还是继续被后面的第二条数据覆盖。\n\n3. 那么可以排除不是插入语句的问题，因为单独插入也会覆盖，那就只有可能就是表定义的时候，有的字段定义的问题，查看表中的字段。找出可能使UserInfo前后插入的2条记录被mysql认为是相同数据的关键字段。\n![](https://image.xinwei.ltd/image_41704550437729.png)\n\n找到问题了，每次生成User记录的时候，关联生成的UserInfo记录中，只赋值了Token字段，保证了Token是唯一的，但是定义为unique列属性的字段Name却都是无值的，后续的新UserInfo记录就被认为和已经存在数据库中的第一条记录是同一个，那么就不会执行插入，而是更新。\n\n问题解决\n根据以上的第3步，发现定义Name的时候，确实冗余增加了unique列属性，导致插入记录覆盖，所以将列属性gorm:\"unique\"去掉就好了。\n\n\n","问题描述 在使用gorm插入数据时，有2张表是关联的，两张表分别是User和UserInfo表，而User和UserInfo是HasOne关联关系。 在插入User一条数据时，会关联生成一条UserInfo记录。 在插入第一条User记录时，会关联创建一条UserInfo记录，在第一条数据时没有问题。 当插入第二条User记录时，发现User的新记录创建是成功的，但是UserInfo表中仍然只有一","https://image.xinwei.ltd/image_11704550303976.png",499668042977349,{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":19,"createdAt":20},"13121171998","全栈老韩",1,"https://image.xinwei.ltd/images/IMG_5430.JPG","全栈工程师，擅长iOS App开发、前端（vue、react、nuxt、小程序&Taro）开发、Flutter、React Native、后端（midwayjs、golang、express、koa）开发、docker容器、seo优化等。","2024-01-01T16:14:30.305Z",2,{"id":21,"name":23},"IT技术",16,{"id":24,"name":26,"parentId":21},"Golang",[],"",109,0,"golang,gorm,insert error,gorm表插入,sql错误,DUPLICATE KEY UPDATE"]