mysql 刪除表中多余的重復記錄


===============================================

 2019/7/16_第1次修改                       ccb_warlock

 

===============================================

接着上一個話題(https://www.cnblogs.com/straycats/p/11198340.html),做完了表結構和表內容的備份后,接着就需要刪除數據。

然而在刪除數據的過程中發現,存在多條相同的業務數據記錄到了數據庫中(表現為,除了索引字段,其他所有字段的內容完全一致)。這樣就導致原本的線性增加趨勢更明顯,臟數據不僅浪費了空間,更影響了查詢的效率。

故還是通過sql語句的處理還刪除那些邏輯上重復的數據。

 

daily_t表結構如下:

字段名 描述
TID 索引id
USER_ID 用戶id
STATS_DATE 日期

 

查看要刪除的重復記錄(在刪除數據前先做查詢確認范圍)

SELECT *
FROM   daily_t
WHERE  (USER_ID, STATS_DATE) IN (
       SELECT *
       FROM   (SELECT   USER_ID, STATS_DATE
               FROM     daily_t
               GROUP BY USER_ID, STATS_DATE
               HAVING   count(*) > 1) A)
AND    TID NOT IN (
        SELECT *
        FROM   (SELECT   min(TID)
                FROM     daily_t
                GROUP BY USER_ID, STATS_DATE
                HAVING   count(*) > 1) B)
ORDER BY USER_ID, STATS_DATE;

 

刪除重復的記錄(只留有索引最小的記錄)

DELETE
FROM   daily_t
WHERE  (USER_ID, STATS_DATE) IN (
       SELECT *
       FROM   (SELECT   USER_ID, STATS_DATE
               FROM     daily_t
               GROUP BY USER_ID, STATS_DATE
               HAVING   count(*) > 1) A)
AND    TID NOT IN (
        SELECT *
        FROM   (SELECT   min(TID)
                FROM     daily_t
                GROUP BY USER_ID, STATS_DATE
                HAVING   count(*) > 1) B);

 

PS.sql語句中之所以對子查詢多嵌套了一層(select *)是為了規避mysql不支持在where中進行針對需要刪除操作的表的子查詢(1093-You can’t specify target table for update in FROM clause),因為多嵌套了一層(select *)后,子查詢內操作的是兩張臨時表A、B,而不是daily_t。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM