0

MySQL に word という名前の挿入専用テーブルがあります。行数が 1000000 を超えたら、テーブルの最初の 100000 行を削除したいと考えています。

Python で mysqldb を使用しているため、グローバル変数があります。

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

Python 環境のテーブルの行数を返します。次に、新しい行を挿入するたびに単語数を 1 増やします。次に、行数が 1000000 より大きいかどうかを確認します。そうであれば、最初の 100000 行を削除します。

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

私はこのスレッドからこのアイデアを得ました: データベースの最初の X 行を削除します

ただし、この SQL はテーブル全体を削除して終了します。ここで何が欠けていますか?

ありがとうございました。

4

2 に答える 2

0

テーブル「単語」に ID フィールド (キー 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;

また、クエリを高速化するために、ID フィールドの tt_ids にいくつかのインデックスを作成することもできます。

于 2013-07-09T10:30:44.770 に答える
0

行数を取得する正しい方法ではないと思います。ステートメントを変更して、count(*)MySQL の cursor.fetchone() を使用して結果のタプルを取得する必要があります。最初の位置 (のようなものwordcount = cursor.fetchone()[0]) には正しい行数が含まれます。

あなたの削除ステートメントは正しいように見えますが、おそらく明示的なトランザクションがありますか? その場合commit()、削除後に db オブジェクトを呼び出す必要があります。

于 2013-07-08T20:20:31.360 に答える