mysql怎么删除临时表里的数据_sql-如何删除没有临时表的MySQL表中的所有重复记录...

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

我已经看到了许多变化,但是没有什么与我想要完成的完全匹配。

我有一张表TableA,其中包含用户对可配置问卷的回答。 列是member_id, quiz_num, question_num, answer_num。

不知何故,一些成员两次提交了答案。 因此,我需要删除重复的记录,但要确保留有一行。

没有主列,因此可能有两行或三行的数据完全相同。

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

8个解决方案

101 votes

在表格上添加唯一索引:

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

);

Saharsh Shah answered 2020-07-04T12:13:13Z

13 votes

这不使用TEMP表,而是使用实际表。 如果问题仅与临时表有关,而与表的创建或删除表无关,则可以使用:

SELECT DISTINCT * INTO TableA_Verify FROM TableA;

DROP TABLE TableA;

RENAME TABLE TableA_Verify TO TableA;

christoph answered 2020-07-04T12:13:33Z

13 votes

您可以删除所有寄存器(delete from TableA;),而不是drop table 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;

jveirasv answered 2020-07-04T12:13:54Z

7 votes

感谢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;

nikolais answered 2020-07-04T12:14:18Z

6 votes

在表格上添加唯一索引:

ALTER IGNORE TABLE TableA

ADD UNIQUE INDEX (member_id, quiz_num, question_num, answer_num);

工作很好

Dina Elwy answered 2020-07-04T12:14:42Z

3 votes

如果您没有使用任何主键,请一次执行以下查询。 通过替换值:

# 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

创建临时表并存储不同的(非重复的)值

制作空的原始表格

从临时表插入值到原始表

删除临时表

始终建议您在使用数据库之前先对其进行备份。

Sandesh Mhatre answered 2020-07-04T12:15:24Z

1 votes

如评论中所述,如果项目重复多次,则必须多次运行Saharsh Shah答案中的查询。

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

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;

基本上,这将检查当前行是否与最后一行相同,如果存在,则将其标记为重复(order语句可确保重复显示并排显示)。 然后,您删除重复的记录。 我删除了alter table ignore列的末尾以使其恢复到原始状态。

看起来alter table ignore也可能很快消失:[http://dev.mysql.com/worklog/task/?id=7395]

juacala answered 2020-07-04T12:15:58Z

1 votes

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

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

user1838915 answered 2020-07-04T12:16:31Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值