[MySQL] сократить одинаковые строки

vlfdimir58

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

artimon

Я бы сделал select distinct во временную таблицу, прибил старую таблицу и переименовал временную.

vlfdimir58

я ничем не рискую во время этих операций?

RED-GREEN

Максимум - рабочим местом

artimon

не знаю.

Dasar

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

vlfdimir58

наиболее быстро при условии отсутствия риска потерять что-либо

Dasar

Что-то типа:
1. добавляешь поле ID к таблице
2. Select bla-bla, min(id) .. group by bla-bla, id во вспомогательную таблицу tmp
3. delete .. where id not in (select * From tmp)
4. убиваешь id-поле
если есть связи на первую таблицу, то делаешь
2.5 update ... set id= select id from tmp where bla-bla = tmp.bla-bla
это медленнее, чем вышеприведенный вариант, но работает лучше, если есть какие-нибудь связи. тригеры или констрейнты.

grnat

Можно полегче, правда я не знаю есть ли в МайСиквеле rowid

delete
from <table>t t where t.rowid<>
(select max(rowid) from <table> where <условие на идентичность данных>)

grnat

сделай лучше вначале селект * - проверь чтоб записей было N-1

grnat

Во теперь правильно забыл 1 условие.

delete
from test t where (t.rowid<>
(select max(rowid) from test where id=1 and id=1

rosali

Во-первых в большинстве MySQL-ей нельзя написать delete ... where ... select, там просто нет вложеных запросов. Во-вторых, ... ладно кароче пофиг что во-вторых.
Мое решение: создать новую таблицу с такой же сигнатурой, потом создать в ней unique ключ над нужными полями, потом сказать insert ignore t2 select * from t1; Всё.

Marinavo_0507

> в большинстве MySQL-ей
это как?

ava3443

Все версии, меньшие 4.1
И таких действительно большинство, по крайней мере на массовых хостингах

asel75

веселее, когда пруд пруди баз и надо слить в одну без повторов - вот это песня на объемах свыше полумиллиона записей!

rosali

надо слить в одну без повторов
Еще раз для глухих - insert ignore.
Оставить комментарий
Имя или ник:
Комментарий: