我已经看到了一些变化,在此,但没有完全符合你什么,我试图完成。
我有一个表, TableA
,其中包含用户给配置的问卷答案。 该列member_id, quiz_num, question_num, answer_num
。
不知怎的,少数成员提交了两次自己的答案。 所以,我需要删除重复记录,但要确保一行留下。
没有主列,因此有可能是两个或三排所有的数据完全相同。
是否有一个查询,删除所有的重复?
我已经看到了一些变化,在此,但没有完全符合你什么,我试图完成。
我有一个表, TableA
,其中包含用户给配置的问卷答案。 该列member_id, quiz_num, question_num, answer_num
。
不知怎的,少数成员提交了两次自己的答案。 所以,我需要删除重复记录,但要确保一行留下。
没有主列,因此有可能是两个或三排所有的数据完全相同。
是否有一个查询,删除所有的重复?
添加唯一索引你的表:
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
);
这不使用临时表,但真实的表来代替。 如果问题只是临时表,而不是关于表的创建或删除表,这将工作:
SELECT DISTINCT * INTO TableA_Verify FROM TableA;
DROP TABLE TableA;
RENAME TABLE TableA_Verify TO TableA;
而不是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;
添加唯一索引你的表:
ALTER IGNORE TABLE TableA
ADD UNIQUE INDEX (member_id, quiz_num, question_num, answer_num);
是工作非常好
由于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;
如果您没有使用任何主键,然后在一个单一的行程执行以下查询。 通过替换值:
# 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
它始终是可取的,你玩它之前采取的数据库备份。
正如在评论中指出,在Saharsh沙阿的答案查询必须运行,如果项目是重复多次多次。
下面是不会删除任何数据的解决方案,并保持数据的原始表的全部时间,允许重复被删除,同时保持表“现场”:
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;
这基本上将检查如果当前行是一样的最后一排,如果是,作为重复(顺序语句确保副本将显示彼此相邻时)将其标记。 然后删除重复记录。 我删除duplicate
末列,使其恢复到原来的状态。
它看起来像alter table ignore
也可能很快消失: http://dev.mysql.com/worklog/task/?id=7395
另一种方法是创建具有相同结构的一个新的临时表。
CREATE TABLE temp_table AS SELECT * FROM original_table LIMIT 0
然后创建该表的主键。
ALTER TABLE temp_table ADD PRIMARY KEY (primary-key-field)
最后,所有的记录从原始表复制而忽略重复的记录。
INSERT IGNORE INTO temp_table AS SELECT * FROM original_table
现在,您可以删除原始表和重命名新表。
DROP TABLE original_table
RENAME TABLE temp_table TO original_table