mysql使用join做update操纵与使用join做查询时出现重复记录的问题

    在实际处理数据过程中,有一些数据可能会从别的地方导入过来,两个表有关联,但是一个表中的某一列缺失,如果要补全,可以利用另一个表来做填充。这里就是今天的第一个问题,使用update的时候,join另一个表。

    如下所示,xx_a中的数据是完整的,xx_b中的name是缺失的,假定xx_b中的user_id正好与xx_a中的id对应,这个时候,我们可以直接update修改xx_b,让xx_b.name = xx_a.name,但是需要给出关联条件与连接语句。

    

这里update语句的编写和查询语句有些类似,但是又有一些区别。update 的语法是

update xx_b set name = ${name} where id = ${id}

但是这里,我们需要关联xx_a,语句如下:

UPDATE xx_b b 
LEFT JOIN xx_a a 
ON b.user_id = a.id
SET b.name = a.name

SQL运行截图如下:

 

    修改之后,发现两边的数据都一样了。

    这种修改,背后隐藏的逻辑就是xx_a 、xx_b两边的数据是一一对应的,一个id对应另一个表,只有一个记录。但是,如果是一对多的问题,那么在查询的时候可能会出现很怪异的问题。

    我们先在xx_b中增加一条记录(name,user_id) values ('e',5)。

mysql> insert into xx_b(name,user_id) values ('e',5);
Query OK, 1 row affected (0.01 sec)

  xx_a中符合条件(id>3)的记录有两条:

     但是,关联xx_b表的时候,结果就出乎意料了:

     事实上,确实应该是3条记录,因为关联的时候xx_b中user_id=5的记录有两个:

    但是,我们在实际应用中,希望以左边的表为主表,满足条件的应该是两条,这种因为一对多的关系导致出现了意外,解决办法就是:

1、使用distinct关键字过滤。

2、使用group by语句对结果进行分组。 

     

    使用group by语句分组,可以起到去重的功能:

 

    相对来说,使用distinct关键字更简单一些。 

MySQLUPDATE JOIN操作是用来根据两个或多个表之间的关联条件,同更新多个表的记录。在某些情况下,使用UPDATE JOIN可能会导致插入重复的记录。 原因可能有以下几点: 1. 关联条件不准确:在UPDATE JOIN语句中,需要明确定义两个或多个表之间的关联条件。如果关联条件定义不准确,可能会导致多个匹配的记录被更新,从而插入重复的记录。 2. 数据冲突:如果在UPDATE JOIN操作中更新的字段存在唯一性约束,而更新操作引起了唯一性冲突,那么会出现插入重复记录的情况。 3. 重复数据:如果被更新的表中存在重复的数据,则在UPDATE JOIN操作中可能会出现插入重复记录的情况。例如,如果更新关联条件匹配到了多条相同的记录,则每一条匹配的记录都会被更新,从而插入了重复的记录。 为了避免在UPDATE JOIN操作中插入重复的记录,可以采取以下措施: 1. 仔细定义关联条件:确保UPDATE JOIN语句中的关联条件准确无误,只匹配到需要更新的记录,避免多余的匹配。 2. 检查唯一性约束:在更新操作之前,先检查被更新的字段是否存在唯一性约束,确保不会引起唯一性冲突。 3. 清理重复数据:如果被更新的表中存在重复的数据,可以先进行数据清理,删除重复的记录,然后再执行UPDATE JOIN操作。 总之,要确保在使用MySQLUPDATE JOIN操作不插入重复的记录,需要注意关联条件的准确性、唯一性约束的检查以及数据的清理工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值