===============================================
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。