如何在没有临时表的情况下删除MySQL表中的所有重复logging

我已经看到了一些变化,但没有什么完全符合我想要完成的。

我有一个表格TableA,其中包含用户给出的可configuration调查问卷的答案。 列是member_id,quiz_num,question_num,answer_num。

不知何故,有几个成员提交了两次答案。 所以我需要删除重复的logging,但要确保留下一行。 没有“主要”列,因此可能有两三行全部具有完全相同的数据。

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

在桌子上添加唯一索引

ALTER IGNORE TABLE `TableA` ADD UNIQUE INDEX (`member_id`, `quiz_num`, `question_num`, `answer_num`); 

另一种做法是:

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

 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 ); 

您可以删除所有寄存器( delete from TableA; ),而不是delete from TableA;表,然后用来自TableA_Verify(从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;

这不使用TEMP表,而是使用真正的表。 如果问题只是关于临时表而不是关于表创build或删除表,这将工作:

 SELECT DISTINCT * INTO TableA_Verify FROM TableA; DROP TABLE TableA; RENAME TABLE TableA_Verify TO TableA; 

感谢上面的答案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;

在桌子上添加唯一索引:

 ALTER IGNORE TABLE TableA ADD UNIQUE INDEX (member_id, quiz_num, question_num, answer_num); 

工作非常好

如果您没有使用任何主键,那么在一个笔画中执行以下查询。 通过replace值:

 # table_name - Your Table Name # column_name_of_duplicates - Name of column where duplicate entries are found create table table_name_temp like table_name; insert into table_name_temp select distinct(column_name_of_duplicates),value,type from table_name group by column_name_of_duplicates; delete from table_name; insert into table_name select * from table_name_temp; drop table table_name_temp 
  1. 创build临时表并存储不同(非重复)值
  2. 使空的原始表
  3. 将值从临时表插入原始表
  4. 删除临时表

在使用数据库之前,最好先备份数据库。

正如在评论中指出的那样,如果项目重复多次,则必须多次运行Saharsh Shah答案中的查询。

这是一个不删除任何数据的解决scheme,并且始终将数据保留在原始表中,从而允许在保留表“活动”的同时删除重复项:

 alter table tableA add column duplicate tinyint(1) not null default '0'; update tableA set duplicate=if(@member_id=member_id and @quiz_num=quiz_num and @question_num=question_num and @answer_num=answer_num,1,0), member_id=(@member_id:=member_id), quiz_num=(@quiz_num:=quiz_num), question_num=(@question_num:=question_num), answer_num=(@answer_num:=answer_num) order by member_id, quiz_num, question_num, answer_num; delete from tableA where duplicate=1; alter table tableA drop column duplicate; 

这基本上检查当前行是否与最后一行相同,如果是,则将其标记为重复(顺序语句确保重复将彼此紧挨着显示)。 然后你删除重复的logging。 我最后删除duplicate列,使其恢复到原来的状态。

看起来像alter table ignore也可能马上消失: http : //dev.mysql.com/worklog/task/?id=7395

另一种方法是创build一个具有相同结构的新临时表。

 CREATE TABLE temp_table AS SELECT * FROM original_table LIMIT 0 

然后在表中创build主键。

 ALTER TABLE temp_table ADD PRIMARY KEY (primary-key-field) 

最后复制原始表中的所有logging,同时忽略重复的logging。

 INSERT IGNORE INTO temp_table AS SELECT * FROM original_table 

现在您可以删除原始表格并重新命名新的表格。

 DROP TABLE original_table RENAME TABLE temp_table TO original_table 
    Interesting Posts