0

Python で MySQLdb の executemany 関数を使用して、複数の行を挿入し、重複更新を行っています。それはそのように機能します。しかし問題がある。ほとんどの行は、通常、1 回または 2 回の挿入で更新する必要があります。そのテーブルに自動採番フィールドがあります。そして、このクエリが実行されるたびに、実際に挿入されたカウントがジャンプよりもはるかに下にある場合でも、autonumber フィールドがジャンプします。IDは基本的に無駄です。ここで何が起こっているのか、これを回避する方法の手がかりはありますか? ありがとう!!

4

1 に答える 1

0

これは、MySQL サーバーが自動インクリメント フィールドを処理する方法の結果です。MySQLdb モジュールは、自動インクリメントの動作にはまったく影響しません。

MySQL Performance Blogでは、ギャップが発生する理由と、ミューテックス テーブルを使用してそれらを回避する方法について詳しく説明しています。手短に:

create table mutex(
    i int not null primary key
);
insert into mutex(i) values (1);

insert into foo(name) select 1 from mutex left outer join foo on foo.name=1 where mutex.i = 1 and foo.name is null;

つまり、ミューテックス テーブルに対して左外部結合を行う副選択を使用して挿入します。なぜこれが機能するのですか?ID が既にミューテックス テーブルにある場合は、再利用されます。それ以外の場合、結合によって NULL が生成され、自動インクリメントがトリガーされます。

于 2012-09-21T18:08:13.333 に答える