2015-06-04 4 views
3

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

+--------------------+----------+ 
| email    | password | 
+--------------------+----------+ 
| [email protected] | xxx  | 
| [email protected] | xxx  | 
| [email protected] | xxx  | 
+--------------------+----------+ 

Я хочу, чтобы удалить повторяющиеся строки (ы), где адрес электронной почты и пароль одинаковы.

Любые идеи о том, как это сделать?

+2

'email' и' password' * are * columns. Я предполагаю, что вы имеете в виду «ряды». –

+0

@ GordonLinoff А, да, мои извинения. –

ответ

1

Учитывая, что у вас нет столбца ID, один путь, чтобы создать временную таблицу и повторно вставить данные:

create temporary table tempt as 
    select distinct email, password 
    from yourtable; 

truncate table yourtable 

insert into yourtable(email, password) 
    select email, password 
    from tempt; 

EDIT:

_pala имеет хорошую точку. Вы можете предотвратить эту проблему:

create unique index idx_table_email_password on table(email, password) 

Я бы также посоветовал включить первичный ключ с автоинкрементами. Однако речь шла об удалении дубликатов из существующей таблицы, а не о лучшей структуре данных.

+0

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

2

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

создать уникальный (композитный) индекс по столбцы (столбцы), которые вы хотите быть уникальными. В вашем случае ваш SQL будет выглядеть примерно так:

Alter table yourtablename 
add unique index idx_unq(`email`,`password`); 

Затем сделать INSERT IGNORE INTO вместо с INSERT INTO. Это будет игнорировать любые дубликаты будущих записей из заселения в таблицу.

Это сообщение также может помочь вам.

"INSERT INTO .. ON DUPLICATE KEY UPDATE" Only inserts new entries rather than replace?

+0

Возможно, вы захотите проверить последние версии MySQL. Этот подход в основном устарел (и фактически удален в 5.7.4): https://dev.mysql.com/doc/refman/5.7/en/alter-table.html. –

+0

В нем говорится: «Начиная с MySQL 5.7.4, предложение IGNORE для ALTER TABLE удаляется, и его использование вызывает ошибку». Он не говорит, что он удаляется для 'insert', что является вашим прецедентом. этот ответ выглядит так, как будто это будет хорошо для 5.7.4: https://dev.mysql.com/doc/refman/5.7/en/insert.html. В принципе, вы не сможете использовать старый трюк «alter ignore add unique ...» для удаления обманов. –

+0

@pala_. , , Дело в том, что 'alter table' удаляет дубликаты * с помощью ключевого слова' IGNORE' *. Это больше не разрешено в 5.7.4, поэтому дубликаты не будут удалены; вместо этого оператор будет генерировать ошибку. –

Смежные вопросы