Mysql--刪除資料表重複行
阿新 • • 發佈:2019-01-08
準備示例資料
以下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','[email protected] '),
('Zbyszek ','Piestrzeniewicz','[email protected]'),
('Roland','Keitel','[email protected]'),
('Julie','Murphy','[email protected]'),
('Kwai','Lee','[email protected]'),
('Jean','King','[email protected]'),
('Susan','Nelson','[email protected] '),
('Jean','King','[email protected]'),
('Peter','Ferguson','[email protected]'),
('Jonas ','Bergulfsen','[email protected]'),
('Janine ','Labrune','[email protected]'),
('Susan','Nelson','[email protected]'),
('Janine ','Labrune','[email protected] '),
('Jonas ','Bergulfsen','[email protected]'),
('Janine ','Labrune','[email protected]'),
('Susan','Nelson','[email protected]'),
('Roland','Keitel','[email protected]');
方式一 克隆表刪除重複的行**
以下是使用克隆/複製表刪除重複行的步驟
- 克隆需要刪除重複資料的表 ,其結構與要刪除重複行的原始表相同。
- 將原始表中的
不同行
插入直接表。 刪除原始表
或修改原始表名
並將克隆表重新命名為原始表
。
例如,以下語句從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;
該查詢返回一個空集合,這意味著重複的行已被刪除。