4

InnoDBを使用するMySQLのテーブルがあり、「id」という名前の列があります。

したがって、私の問題は、テーブルから最後の行を削除してから新しい値を挿入するたびに、削除されたIDの後に新しい値が挿入されることです。

つまり、IDが32で、それを削除したいのですが、削除後に新しい行を挿入すると、列IDが33に自動インクリメントされます。したがって、シリアル形式は壊れています。つまり、id=30,31,33です。 32はありません。

したがって、最後の列を削除した後に挿入するときは、33ではなく32のIDを割り当てるのを手伝ってください。

4

4 に答える 4

17

簡単な答え:いいえ。

なんで?

  1. 不要な作業です。シリアル番号にギャップがあるかどうかは関係ありません。
  2. それが望ましくない場合は、auto_incrementを使用しないでください。
  3. 心配しないでください。列の型がint型またはbigint型である場合でも、数値が不足することはありません。
  4. 行を削除したときにMySQLが自動インクリメント値を自動的に減少させないのには理由があります。それらの理由は
    • データの整合性が失われる危険性(複数のユーザーが削除または挿入を実行することを想像してください...エントリが2倍になるか、さらに悪化する可能性があります)
    • マスタースレーブレプリケーションまたはトランザクションを使用すると、エラーが発生する可能性があります
    • 等々 ...

これに時間を無駄にしないことを強くお勧めします!それは本当に、本当にエラーが発生しやすいです。

于 2012-11-30T11:11:44.300 に答える
4

リレーショナルデータベースがどのように機能するかについて、2つの大きな誤解があります。

  1. リレーショナルデータベースには「最後の行」のようなものはありません。
  2. ID(それが主キーであると仮定)は何の意味もありません。新しい行に33、35354、または236532652632が割り当てられているかどうかは関係ありません。これは、その行を一意に識別するための値にすぎません。

主キー列の連続する値に依存しないでください。

max(id)+1そして、アプローチを試みないでください。複数のトランザクションがあるシステムでは機能しません。

于 2012-11-30T11:12:54.107 に答える
3

SELECT max(id)Innodbのようなトランザクションデータベースエンジンを使用している場合、を使用してもこれが適切に修正されない場合でも、これとの戦いをやめる必要があります。

なぜあなたは尋ねるかもしれませんか?ほぼ同時に開始されたAとBの2つのトランザクションがあり、両方ともINSERTを実行しているとします。最初のトランザクションAには新しい行が必要idであり、このテーブルに関連付けられた非表示のシーケンス(AUTOINCREMENT値と呼ばれる)から21行を使用します。別のトランザクションBは、別の連続する値(22など)を使用します。

しかし、トランザクションAがロールバックした場合はどうなりますか?値21は再利用できず、22はすでにコミットされています。そして、そのようなトランザクションが10回あった場合はどうなるでしょうか?

またmax(id)、AとBの両方に同じ値を割り当てることができるため、これも無効です。

于 2012-11-30T11:13:50.420 に答える
0

「テーブルから最後の行を削除するときはいつでも」という意味だと思いませんか?

とにかく、これは自動インクリメントがどのように機能するかです。正しいデータ関係を維持するために作られています。別のテーブルで削除されたレコードのIDを使用する場合、そのIDを照会するときに別のレコードを取得するのではなく、エラーを取得する方が正しいです。

とにかくここでは、フィールドで最初の無料IDを取得する方法を確認できます。

于 2012-11-30T11:13:03.963 に答える