萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 查找與刪除重複資料完整指南 (單欄、多欄、存儲過程)

資料表中常因缺乏唯一約束而產生重複列。本文提供單欄位、多欄位、臨時表輔助、存儲過程等多種去重方案,並附測試數據與表結構。

一、單欄位去重 (以 question_title 為例)

1. 查找重複

SELECT * FROM questions
WHERE question_title IN (
    SELECT question_title FROM questions
    GROUP BY question_title HAVING COUNT(question_title) > 1
);

2. 刪除重複 (保留最小 id)

DELETE FROM questions
WHERE id IN (
    SELECT id FROM questions
    GROUP BY question_title HAVING COUNT(question_title) > 1
) AND id NOT IN (
    SELECT MIN(id) FROM questions
    GROUP BY question_title HAVING COUNT(question_title) > 1
);

二、多欄位去重 (questions_title, questions_scope)

直接刪除語法在某些版本不支援,建議採用臨時表:

CREATE TABLE tmp AS
SELECT question_id FROM questions
WHERE (questions_title, questions_scope) IN (
    SELECT questions_title, questions_scope FROM questions
    GROUP BY questions_title, questions_scope HAVING COUNT(*) > 1
) AND question_id NOT IN (
    SELECT MIN(question_id) FROM questions
    GROUP BY questions_title, questions_scope HAVING COUNT(*) > 1
);

DELETE FROM questions WHERE question_id IN (SELECT question_id FROM tmp);
DROP TABLE tmp;

三、存儲過程游標去重 (通用模板)

DECLARE @max INT, @id INT;
DECLARE cur_rows CURSOR LOCAL FOR
SELECT 主鍵, COUNT(*) FROM 表名 GROUP BY 主鍵 HAVING COUNT(*) > 1;
OPEN cur_rows;
FETCH cur_rows INTO @id, @max;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @max = @max - 1;
    SET ROWCOUNT @max;
    DELETE FROM 表名 WHERE 主鍵 = @id;
    FETCH cur_rows INTO @id, @max;
END
CLOSE cur_rows;
SET ROWCOUNT 0;

四、測試數據表結構與樣本

文中提供完整 CREATE TABLE 及 INSERT 語句,可直接複製執行驗證上述方案。

copyright © 萬盛學電腦網 all rights reserved