MYSQL 根据条件假删除多余的重复数据

本文详细描述了如何在MySQL中通过UPDATE语句结合JOIN和窗口函数ROW_NUMBER(),根据特定条件更新表中除第一行外的重复数据,包括设置is_delete字段和delete_by_uuid。强调了在操作前备份数据和在安全环境测试的重要性。
摘要由CSDN通过智能技术生成

在MySQL中,如果您想根据特定条件更新表中的记录,并且这些记录是基于重复数据的一部分,您可以使用UPDATE语句结合JOIN和窗口函数(如ROW_NUMBER())。在您提供的例子中,您想要更新table_a 表,将除了每组重复记录中的第一行之外的所有行的is_delete字段设置为1,并且设置delete_by_uuid字段为'xingzhic'。同时,您还添加了一些额外的筛选条件。

请注意,在MySQL中,窗口函数(如ROW_NUMBER())不能在UPDATE语句的WHERE子句中直接使用。因此,您需要使用一个子查询或临时表来先确定哪些行应该被更新。以下是一个可能的解决方案,它使用了子查询和JOIN来执行更新操作:

UPDATE table_a t1  
JOIN (  
    SELECT id  
    FROM (  
        SELECT id, ROW_NUMBER() OVER (PARTITION BY student_userid ORDER BY id) AS rn  
        FROM table_a
        WHERE school_year_id = 32  
          AND is_delete = '0'  
          AND company_uuid = 'xxxxxx'  
    ) AS subquery  
    WHERE rn > 1  
) t2 ON t1.id = t2.id  
SET t1.is_delete = '1', t1.delete_by_uuid = 'xingzhic';

在这个查询中:

  1. 内部子查询(subquery)首先选择了table_a 表中满足所有指定条件(school_year_idis_deletecompany_uuid)的记录,并为每组student_userid分配了一个行号(rn)。

  2. 外部子查询(t2)从内部子查询中选择了那些行号大于1的记录,即每组重复记录中除了第一行之外的所有行。

  3. UPDATE语句通过JOIN操作连接了原始表table_a (t1)和外部子查询结果(t2),连接条件是id字段相等。

  4. SET子句将连接结果中t1表的is_delete字段设置为1,并将delete_by_uuid字段设置为'xingzhic'。

请注意,ORDER BY idROW_NUMBER()函数中是必要的,因为窗口函数需要知道如何对每组内的行进行排序。您需要替换id为您想要根据其排序的列名。

再次提醒,在执行更新操作之前,请确保备份您的数据,并在一个安全的环境中测试这些查询,以确保它们按预期工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值