2

私はテーブルを持っています:テスト

id int(10) 自動インクリメント name char(36)

ここで、ID 1000 => 最大の一意の ID 番号から満たされたテーブル全体を考えてみましょう。ID 1 - 1000 = 以前に削除されました。

質問1; mysql はこれらの削除された ID を再利用しますか? 質問2; そうでない場合、自動インクリメントなど、テーブルに存在しない一意の識別子を再利用するにはどうすればよいですか?

私が尋ねている理由は、私のテーブルが多くのエントリで構成され、多くのエントリが常に削除されるためです。自動インクリメントを使用しているときに「id が不足」するとどうなりますか?

これについての啓発をありがとう:)

-トム

4

3 に答える 3

3
  1. mysql はこれらの削除された ID を再利用しますか?

    開始時に、現在のレコードの最大値を見つける (および 1 を追加する) ことによってmysqld、すべての列の次の値を決定します。AUTO_INCREMENTしたがって、値が最も高いレコードを削除してサーバーを再起動すると、削除された ID が実際に再利用されます。

    それ以外の場合、次の値を手動で変更した場合にのみ値が再利用されAUTO_INCREMENTます (これは同時実行セーフではないため、お勧めしません)

    ALTER TABLE foo AUTO_INCREMENT = 12345;
    
  2. そうでない場合、自動インクリメントなど、テーブルに存在しない一意の識別子を再利用するにはどうすればよいですか?

    一般的に言えば、次のことはしません: 挿入/削除がこのように行われないようにデータ構造を再設計することを検討するか、より大きな整数型を使用することを検討してください ( BIGINT UNSIGNED8 バイトなので、2^64 または ~10^19 になる可能性があります)。 )。

  3. 自動インクリメントを使用しているときに「id が不足」するとどうなりますか?

    マニュアルに記載されているように:

    AUTO_INCREMENT列には、必要な最大シーケンス値を保持するのに十分な大きさの最小の整数データ型を使用してください。列がデータ型の上限に達すると、次のシーケンス番号生成の試行は失敗します。

于 2012-06-04T21:04:52.023 に答える
1
  1. いいえ、MySQL は削除されたレコードの ID を再利用しません
  2. 本当に必要ですか?自動インクリメント列のタイプが BIGINT の場合、18446744073709551615 の可能な ID があります
于 2012-06-04T20:49:57.703 に答える
0

自動インクリメントをリセットする必要があります。自動インクリメントはインクリメントし続け、少なくとも設定しないと元に戻りません。

alter table tablename auto_increment=value

このような

mysql> alter table t1 auto_increment=200;
Query OK, 202 rows affected (0.04 sec)
Records: 202  Duplicates: 0  Warnings: 0

編集: いくつかのレコードを削除すると、auto_increment は「最後の値 + 1」になります。テーブル全体を削除した場合にのみ、「最初からやり直す」ことができます。

トリガーを使用するのが最善ですが、トリガーはテーブルを変更できません ( http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html )

したがって、最後のオプションはストア プロシージャです。こちらをご覧ください:ストアド プロシージャを介して mySql のテーブルを変更することは可能ですか?

これはお勧めできません。

于 2012-06-04T20:46:59.937 に答える