web-dev-qa-db-ja.com

MySQL-最後の行が削除された場合、自動インクリメントは順次インクリメントしません

自動インクリメントされた主キーIDを含むテーブルがあります。最後の行(たとえば、最高のID、たとえばid = 6)を削除して新しい行を挿入すると、新しいIDは7から始まります。主キーが6から始まるように変更する必要があるパラメーターはどれですか。

CREATE TABLE animals (
 id MEDIUMINT NOT NULL AUTO_INCREMENT,
 name CHAR(30) NOT NULL,
 PRIMARY KEY (id)
) ENGINE=MyISAM;

INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');

結果:
ID名
1匹
2匹の猫
3ペンギン
4緩い
5頭のクジラ
6ダチョウ

DELETE FROM animals WHERE id = 6;
INSERT INTO animals (name) VALUES
('x');

結果:
ID名
1匹
2匹の猫
3ペンギン
4緩い
5頭のクジラ
7 x

アドバイスをありがとう。

8
giordano

これは設計によるものであり、すべてのDBMSはこれを自動インクリメント列で行いました。

それらを行わなかった場合、外部参照整合性が損傷する可能性があります。この簡単な例として、自動インクリメント列をキーとして使用して、短縮サービスのURLを保存しているとします。短縮URLがまだ誰にでも配布されているかどうかはまだわかりませんし、データベースも確かに配布されていないため、ID 1234を再利用すると、貧しいおばあちゃんがクリックしたときにloverlyknitting.orgではなくsomenastypornsite.xxxにアクセスする可能性があります http://shortthi.ng/1234 「申し訳ありませんが、このリンクはレコードに存在しません」というメッセージを受け取る代わりに、古いメールに含まれています。

また、最後のアイテムを削除した後に増分をリセットした場合、5番目のアイテムが削除されたときに、500万の5番目のアイテム以降のすべてに番号を付け直す作業(またはデータベースが期待すること)もすべて実行しますか?インクリメント列を指す外部キー制約である他のテーブルへの変更を完了しましたか?そのような余分な作業は、IOに関しては非常に高価になる可能性があります。

最後のアイテムを削除した後でインクリメントポイントをdoリセットする場合は、トランザクション分離レベルに十分注意してください。別のトランザクションと同様にリセットする可能性がありますアクションが完全に100%分離されていることを確認しない限り、この値を利用してエラー(またはさらに悪いことに、サイレント障害)を引き起こします。

私は通常、データベースで作業している人に、この問題に関する「疑似キーニートフリークス」という章のある「SQLアンチパターン」を読むことをお勧めします(章のタイトルが示唆しているよりもわかりやすい方法で問題をカバーしています!)。基本的に、値がキー(またはせいぜい挿入順序情報)を超える意味を持つ場合、それはおそらく自動インクリメントカラムであってはならず、キー(またはせいぜい挿入順序)以外に意味がない場合情報)ギャップは重要ではありません。

12
David Spillett

次を使用してauto_increment値をリセットできます。

ALTER TABLE MyTable AUTO_INCREMENT = 1234;

上記のステートメントで使用するには、テーブルに存在する最大値を決定し、その値に1を追加する必要があります。

0
Max Vernon