Существует httpauth.py. Я - все еще полный newb с Django, таким образом, я понятия не имею, как он вписывается точно, но он должен сделать то, что Вы ищете.
Редактирование: вот более длинный поток ошибки на предмете .
Я считаю, что это будет сделано, если использовать дублирующий ключ + ifnull ():
create table tmp like yourtable;
alter table tmp add unique (text1, text2);
insert into tmp select * from yourtable
on duplicate key update text3=ifnull(text3, values(text3));
rename table yourtable to deleteme, tmp to yourtable;
drop table deleteme;
Должно быть намного быстрее, чем все, что требует группировки или отдельных, или подзапроса, или даже упорядочения по. Для этого даже не требуется файловая сортировка, которая снижает производительность большой временной таблицы. По-прежнему потребуется полное сканирование исходной таблицы, но этого нельзя избежать.
DELETE FROM dups
WHERE id NOT IN(
SELECT id FROM (
SELECT DISTINCT id, text1, text2
FROM dups
GROUP BY text1, text2
ORDER BY text3 DESC
) as tmp
)
Это запрашивает все записи, группы по полям различения и заказы по ID (означает, что мы выбираем первую непустую запись text3). Затем мы выбираем идентификаторы из этого результата (это хорошие идентификаторы ... они не будут удалены) и удаляем все идентификаторы, которые их НЕ ДЕЛАЮТ.
Любой подобный запрос, затрагивающий всю таблицу, будет медленным. Вам просто нужно запустить его и позволить развернуться, чтобы вы могли предотвратить это в будущем.
После того, как вы сделаете это «исправление», я бы применил UNIQUE INDEX (text1, text2) к этой таблице. Чтобы предотвратить возможность дублирования в будущем.
Если вы хотите пойти по маршруту «создать новую таблицу и заменить старую». Вы можете использовать очень внутренний оператор select для создания вашего оператора вставки.
Для MySQL (предполагается, что новая таблица называется my_tbl2 и имеет точно такую же структуру):
У меня нет большого опыта работы с MySQL. Если в нем есть аналитические функции, попробуйте:
delete from my_tbl where id in ( select id from (select id, row_number() over (partition by text1, text2 order by text3 desc) as rn from my_tbl /* optional: where text1 like 'a%' */ ) as t2 where rn > 1 )
необязательное предложение where означает, что вам придется запускать его несколько раз, по одному для каждой буквы и т. Д.
Если вы можете создать новую таблицу, сделайте это с помощью уникального ключа в полях text1 + text2. Затем вставьте в таблицу, игнорируя ошибки (используя синтаксис INSERT IGNORE):
select * from my_tbl order by text3 desc
Индексы для всех этих столбцов могут очень помочь, но создание их сейчас может быть довольно медленным.