Как удалить все повторяющиеся записи в таблице MySQL без временных таблиц

Я видел несколько вариантов этого, но ничего не соответствует тому, что я пытаюсь выполнить.

у меня есть таблица, TableA, которые содержат ответы пользователей на настраиваемые анкеты. Столбцы member_id, quiz_num, question_num, answer_num.

как-то несколько участников получили свои ответы дважды. Поэтому мне нужно удалить дублированные записи, но убедитесь, что одна строка осталась позади.

нет первичный

8 ответов


добавить Уникальный Индекс на ваш стол:

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

вместо 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;

Это не использует временные таблицы, а реальные таблицы. Если проблема касается только временных таблиц, а не создания или удаления таблиц, это будет работать:

SELECT DISTINCT * INTO TableA_Verify FROM TableA;

DROP TABLE TableA;

RENAME TABLE TableA_Verify TO TableA;

добавить уникальный индекс в таблицу:

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
  1. создайте временную таблицу и сохраните отдельные(не дублирующиеся) значения
  2. сделать пустой оригинальный стол
  3. вставить значения в исходную таблицу из temp table
  4. удалить временную таблицу

всегда рекомендуется сделать резервную копию базы данных, прежде чем играть с ней.


как отмечено в комментариях, запрос в ответе Сахарш Шаха должен выполняться несколько раз, если элементы дублируются более одного раза.

вот решение, которое не удаляет никаких данных и сохраняет данные в исходной таблице все время, позволяя удалять дубликаты, сохраняя при этом таблицу "живой":

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 гарантирует, что дубликаты будут отображаться рядом друг с другом). Затем вы удаляете дубликаты записей. Я удаляю


альтернативным способом было бы создать новую временную таблицу с той же структурой.

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