Mysql

刪除mysql表中不包含主鍵的重複行

  • July 24, 2012

我有一個只有一個列名的表****項:-

name
-----
toys
shirt
mobile
Shirt
speaker
Toys
.... 
....

我正在嘗試在以下查詢的幫助下刪除除一條重複記錄之外的重複行

DELETE FROM
(
SELECT `name`,`rownumber` FROM (SELECT GREATEST(0,@num := IF(`name` = @NAME, 
@num + 1, 1),LEAST(1, LENGTH(@NAME := `name`))) AS rownumber,`name` FROM 
item ORDER BY `name`) AS result1
) AS result 
WHERE rownumber >1

內部查詢(從 SELECT 名稱開始並以 result1 結束)為每個重複組返回單獨的自動遞增數字,但是當我執行整個查詢時它不起作用。

我想知道我需要在內部查詢(包含在圓括號中)中進行哪些更改以刪除重複的行。

本著@yercube 的回答精神,我有一個增加了轉折的答案。

CREATE TABLE stage
(
   id int not null auto_increment,
   name varchar(20),
   primary key (id)
);
CREATE TABLE stage2 LIKE stage;
INSERT INTO stage (name) SELECT name FROM item;
INSERT INTO stage2 (id) SELECT min_id FROM
(SELECT MIN(id) min_id,name FROM stage GROUP BY name) A;
UPDATE stage2 A INNER JOIN stage B USING (id) SET A.name=B.name;
TRUNCATE TABLE item;
INSERT INTO item (name) SELECT name FROM stage2;
DROP TABLE stage;
DROP TABLE stage2;

這將使用 item 中每個名稱的第一次出現載入 stage2,zap item 表,然後載入唯一的出現。

如果您回顧@yercube 的答案並將其與我的答案進行比較,他會更加簡單,因為

  • @yercube 使用一張臨時表,而我使用兩張
  • 我必須為迭代控制創建一個列,@yercube 不需要
  • @yercube 的步驟更少
  • 兩個答案都達到了同樣的目的

我不希望我的回答被接受。我回答的唯一目的是證明其他答案失去了解決您的問題所需的簡潔明了。再次向@yercube 致敬。

我假設您在該表上沒有外鍵約束,因此以下過程將起作用:

製作另一個相同的表:

CREATE TABLE stage
( name VARCHAR(255) NOT NULL
) ;

複製不重複的名稱:

INSERT INTO stage 
 (name)
SELECT name
FROM item
GROUP BY name ;

從原始表中刪除所有內容:

TRUNCATE TABLE item ;

並使name列唯一(或主鍵):

ALTER TABLE item
 ADD CONSTRAINT item_pk
   PRIMARY KEY (name) ;

現在寫回非重複數據:

INSERT INTO item
 (name)
SELECT name
FROM stage ;

並刪除(臨時)表:

DROP TABLE stage ;

引用自:https://dba.stackexchange.com/questions/21314