四时宝库

程序员的知识宝库

gorm [rows 2] INSERT INTO user_info xxx ON DUPLICATE KEY UPDATE uid

问题描述

在使用gorm插入数据时,有2张表是关联的,两张表分别是User和UserInfo表,而User和UserInfo是HasOne关联关系。

在插入User一条数据时,会关联生成一条UserInfo记录。

在插入第一条User记录时,会关联创建一条UserInfo记录,在第一条数据时没有问题。

当插入第二条User记录时,发现User的新记录创建是成功的,但是UserInfo表中仍然只有一条数据,而且第二条UserInfo记录覆盖了第一条。

2023/11/26 21:04:57 /Users/xxx/controller/user/user.go:88
[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)

2023/11/26 21:04:57 /Users/xxx/controller/user/user.go:88
[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)

问题截图

当使用Deug()来查看gorm输出,从截图中可以看出,在插入第2条UserInfo记录的时候,影响到了2条记录。在用Workbench中查看数据库时,发现只有一条记录。

问题思路分析

  1. 首先检查insert语句,分析user记录关联的userinfo记录,比第一次插入时的userinfo记录的区别,结果没有任何发现,都是正常的。
  1. 其次在insert的时候使用Omit掉userInfo字段,不让user记录来关联插入UserInfo记录,在insert了user记录后,再insert一下UserInfo记录,看是否userInfo记录还会被覆盖掉。


结果是userinfo还是继续被后面的第二条数据覆盖。

  1. 那么可以排除不是插入语句的问题,因为单独插入也会覆盖,那就只有可能就是表定义的时候,有的字段定义的问题,查看表中的字段。找出可能使UserInfo前后插入的2条记录被mysql认为是相同数据的关键字段。

找到问题了,每次生成User记录的时候,关联生成的UserInfo记录中,只赋值了Token字段,保证了Token是唯一的,但是定义为unique列属性的字段Name却都是无值的,后续的新UserInfo记录就被认为和已经存在数据库中的第一条记录是同一个,那么就不会执行插入,而是更新。

问题解决
根据以上的第3步,发现定义Name的时候,确实冗余增加了unique列属性,导致插入记录覆盖,所以将列属性gorm:"unique"去掉就好了。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接