如何删除没有临时表的MySQL表中的所有重复记录

Miv*_*ott 45 mysql sql duplicates unique-index sql-delete

我已经看到了很多这方面的变化,但没有什么能与我想要完成的完全匹配.

我有一张表,TableA其中包含用户给出的可配置调查问卷的答案.列是member_id, quiz_num, question_num, answer_num.

不知何故,一些成员得到了两次提交的答案.所以我需要删除重复的记录,但要确保留下一行.

没有列,因此可能有两行或三行都具有完全相同的数据.

是否有查询删除所有重复项?

Sah*_*hah 101

在桌面上添加唯一索引:

ALTER IGNORE TABLE `TableA`   
ADD UNIQUE INDEX (`member_id`, `quiz_num`, `question_num`, `answer_num`);
Run Code Online (Sandbox Code Playgroud)

另一种方法是:

在表中添加主键,然后您可以使用以下查询轻松删除表中的重复项:

DELETE FROM member  
WHERE id IN (SELECT * 
             FROM (SELECT id FROM member 
                   GROUP BY member_id, quiz_num, question_num, answer_num HAVING (COUNT(*) > 1)
                  ) AS A
            );
Run Code Online (Sandbox Code Playgroud)

  • 注意:如果您的表包含3个或更多同一行的重复项,则需要多次运行它 (2认同)
  • @juacala是正确的:“从MySQL 5.7.4开始,ALTER TABLE的IGNORE子句已删除,使用它会产生错误。” (2认同)

chr*_*oph 13

这不使用TEMP表,而是使用真实表.如果问题只是关于临时表而不是表创建或删除表,这将起作用:

SELECT DISTINCT * INTO TableA_Verify FROM TableA;

DROP TABLE TableA;

RENAME TABLE TableA_Verify TO TableA;
Run Code Online (Sandbox Code Playgroud)


小智 13

相反的drop table TableA,你可以删除所有寄存器(delete from TableA;),然后填入原来的表从TableA_Verify到来寄存器(insert into TAbleA select * from TAbleA_Verify).这样你就不会丢失对原始表的所有引用(索引,......)

CREATE TABLE TableA_Verify AS SELECT DISTINCT * FROM TableA;

DELETE FROM TableA;

INSERT INTO TableA SELECT * FROM TAbleA_Verify;

DROP TABLE TableA_Verify;
Run Code Online (Sandbox Code Playgroud)


小智 7

感谢jveirasv的上述答案.

如果需要删除特定列集的重复项,则可以使用此项(如果表中的时间戳有不同,例如)

CREATE TABLE TableA_Verify AS SELECT * FROM TableA WHERE 1 GROUP BY [COLUMN TO remove duplicates BY];

DELETE FROM TableA;

INSERT INTO TableA SELECT * FROM TAbleA_Verify;

DROP TABLE TableA_Verify;
Run Code Online (Sandbox Code Playgroud)


小智 6

在桌面上添加唯一索引:

ALTER IGNORE TABLE TableA   
ADD UNIQUE INDEX (member_id, quiz_num, question_num, answer_num);
Run Code Online (Sandbox Code Playgroud)

工作得很好