准备示例数据
以下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;
该查询返回一个空集合,这意味着重复的行已被删除。