1. 前言
有時候會遇到這樣的問題,一個表中有重複數據,並且數據量比較大,在一萬條以上。這個時候如果用delete刪除重複數據並保留一條的時候會非常之慢,數據庫直接卡死。
這個時候可以通過創建臨時表來進行重複數據的篩選,然後刪除原來的數據,把臨時的表數據再移到數據庫的表中。自己測試這種方法十幾萬的數據量不到1分鐘就可以完成。
2. 開始
2.1 創建臨時表
僞語法:
CREATE TABLE TEMP_DELETE_ORDER_INFO AS
(
查找重複的數據並只顯示一條
union all
查找不重複的數據
)
SQL 案例:
CREATE TABLE TEMP_DELETE_ORDER_INFO AS (
--id重複的數據
select T1.* from ORDER_INFO T1 where T1.id in
(select id from ORDER_INFO group by id having count(id) >1)
AND T1.ROWID NOT IN
(SELECT MIN(ROWID) FROM ORDER_INFO GROUP BY id HAVING COUNT(*) > 1)
--將數據連起來
union all
--id不重複的數據
select T2.* from ORDER_INFO T2 where T2.id in
(select id from ORDER_INFO group by id having count(id) =1)
);
2.2 清空原來的表
truncate TABLE ORDER_INFO;
2.3 將臨時表的數據導入到原來的表中
insert into ORDER_INFO select * from TEMP_DELETE_ORDER_INFO;
2.4 刪除臨時表
DROP TABLE TEMP_DELETE_ORDER_INFO;
3. 結尾
創建臨時表查找重複數據和不重複數據需要根據自己的需求,我這個是根據id重複來查找的。