Как удалить все повторяющиеся записи в таблице 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
- создайте временную таблицу и сохраните отдельные(не дублирующиеся) значения
- сделать пустой оригинальный стол
- вставить значения в исходную таблицу из temp table
- удалить временную таблицу
всегда рекомендуется сделать резервную копию базы данных, прежде чем играть с ней.
как отмечено в комментариях, запрос в ответе Сахарш Шаха должен выполняться несколько раз, если элементы дублируются более одного раза.
вот решение, которое не удаляет никаких данных и сохраняет данные в исходной таблице все время, позволяя удалять дубликаты, сохраняя при этом таблицу "живой":
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