准備示例數據
以下sql
創建表,並將示例數據插入到用於演示的contacts
表中。
CREATE TABLE contacts (
id INT PRIMARY KEY AUTO_INCREMENT,
first_val VARCHAR(50) DEFAULT NULL,
last_val VARCHAR(50) DEFAULT NULL,
email VARCHAR(255) NOT NULL
);
INSERT INTO contacts (first_val,last_val,email)
VALUES ('Carine ','Schmitt','carine.schmitt@yiibai.com'),
('Zbyszek ','Piestrzeniewicz','zbyszek.piestrzeniewicz@att.com'),
('Roland','Keitel','roland.keitel@yahoo.com'),
('Julie','Murphy','julie.murphy@yahoo.com'),
('Kwai','Lee','kwai.lee@google.com'),
('Jean','King','jean.king@qq.com'),
('Susan','Nelson','susan.nelson@qq.com'),
('Jean','King','jean.king@gmail.com'),
('Peter','Ferguson','peter.ferguson@google.com'),
('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'),
('Janine ','Labrune','janine.labrune@qq.com'),
('Susan','Nelson','susan.nelson@qq.com'),
('Janine ','Labrune','janine.labrune@qq.com'),
('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'),
('Janine ','Labrune','janine.labrune@qq.com'),
('Susan','Nelson','susan.nelson@qq.com'),
('Roland','Keitel','roland.keitel@yahoo.com');
方式一 克隆表刪除重復的行
以下是使用克隆/復制表刪除重復行的步驟
- 克隆需要刪除重復數據的表 ,其結構與要刪除重復行的原始表相同。
- 將原始表中的
不同行
插入直接表。 刪除原始表
或修改原始表名
並將克隆表重命名為原始表
。
例如,以下語句從contacts
表中刪除具有重復電子郵件(email
)的行記錄:
-- step1 克隆/復制表結構
CREATE TABLE contacts_temp LIKE contacts;
-- step2 數據不重復插入克隆表
INSERT INTO contacts_temp(first_val,last_val,email) SELECT first_val,last_val,email FROM contacts GROUP BY email;
-- step3 修改原始表以作備份,出錯可以還原
ALTER TABLE contacts
RENAME TO contacts_copy;
-- step4 修改原始表為克隆表
ALTER TABLE contacts_temp
RENAME TO contacts;
方式二 DELETE JOIN 刪除重復行
以下查詢返回contacts
表中的重復email
值:
SELECT
email,
COUNT( email )
FROM
contacts
GROUP BY
email
HAVING
COUNT( email ) > 1;
可以看到,表中有重復email
行記錄。
使用DELETE JOIN語句刪除重復的行
MySQL提供了可用於快速刪除重復行的DELETE JOIN
語句。
以下語句刪除重復的行並保持最高的ID:
DELETE t1
FROM
contacts t1
INNER JOIN contacts t2
WHERE
t1.id < t2.id
AND t1.email = t2.email;
重復行記錄已被刪除。我們再次執行查找重復的電子郵件的查詢:
SELECT
email, COUNT( email )
FROM
contacts
GROUP BY
email
HAVING
COUNT( email ) > 1;
該查詢返回一個空集合,這意味着重復的行已被刪除。