2013-07-08 5 views
0

У меня есть таблица только для вставки в MySQL с именем word. Когда число строк превышает 1000000, я хотел бы удалить первые 100000 строк таблицы.Удалить первые X строк таблицы MySQL, если число строк больше, чем N

Я использую MySQLDb в питона, поэтому у меня есть глобальная переменная:

wordcount = cursor.execute("select * from word") 

будет возвращать количество строк в таблице в среде Python. Затем я увеличиваю число слов на 1 каждый раз, когда я вставляю новую строку. Затем я проверяю, если число строк больше, чем 1000000., если она есть, я хочу, чтобы удалить первые 100000 строк:

if wordcount > 1000000: 
    cursor.execute("delete from word limit 100000") 

я получил эту идею из этой нити: Delete first X lines of a database

Однако это SQL заканчивается удалением моей ENTIRE таблицы, что мне здесь не хватает?

спасибо.

+1

Вы знаете, что 'wordcount = cursor.execute (" select * from word ")' возвращает количество записей? – PeterMmm

+0

В среде python да, в MySQL нет. Например, wordcount = cursor.execute («select count (*) from word») вернет 1 в python, потому что это 1 строка. В то время как мой SQL возвращался в число строк (в среде python), которое является числом – user1452494

+0

Вы читали «курсор» [doc] (http://www.python.org/dev/peps/pep-0249/ # cursor-objects)? – PeterMmm

ответ

0

Я не думаю, что это правильный способ получить количество строк. Вам нужно изменить свой оператор, чтобы иметь count(*), а затем использовать MySQLs cursor.fetchone(), чтобы получить кортеж результатов, где первая позиция (вроде wordcount = cursor.fetchone()[0]) будет иметь правильный счетчик строк.

Ваше заявление на удаление выглядит правильно, возможно, у вас есть явные транзакции? в этом случае вам нужно будет позвонить commit() на свой объект db после удаления.

0

Если в вашем «слово» таблицы есть поле идентификатора (поле auto_increment), вы можете написать некоторую хранимую процедуру удаления первых 100000 строк. Ключевая часть хранимой процедуры:

drop temporary table if exists tt_ids; 
create temporary table tt_ids (id int not null); 

insert into tt_ids -- taking first 100000 rows 
select id from word 
order by ID 
limit 100000; 

delete w 
from word w 
join tt_ids ids on w.ID = ids.ID; 

drop temporary table if exists tt_ids; 

Кроме того, вы можете создать несколько индексов tt_ids на ID-поле для ускорения вашего запроса.

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