5

重複の可能性:
未使用の主キーの使用

自動インクリメントの id 列を持つテーブルを作成しました。そのテーブルで id が 8,12,30 の行を削除したときです。

今、新しいレコードを挿入するときに、次のレコードを 8、次に 12 などに挿入したい.

これを行うためにMySQLの自動インクリメントを取得する方法はありますか?

自動インクリメントをある数値に設定しようとしましたが、そのようにしたくありません。

4

3 に答える 3

7

その場合、自動インクリメント列を使用する必要はありません。ギャップを埋める場合は、それをint列に設定し、ストアドプロシージャまたは挿入でロジックを処理します。

編集:

これはint列なので、数値で並べ替えることができます。を実行しSELECT Ids FROM Table Order By IdsてすべてのIDを取得し、返されたデータセットのギャップを確認します。

これを行うにはおそらくもっとスムーズな方法がありますが、カーソルで結果をループINTし、ループ全体で増分する変数と比較することができます。ギャップ(一致しない)を見つけたら、ループを中断し、そのINT値をINSERTIDとして使用します。

私はあなたのためにあなたのコードを書きませんが、それらはあなたが正しい方向に進むためのいくつかのステップです。それはあなたが扱えるはずの本当に基本的なプログラミングのビットでなければなりません。

お役に立てれば。

編集#2:

他の人が指摘しているように、あなたの最善の策はただギャップを残すことです。テーブルに長さの上限があり、IDが1〜30(奇妙)でなければならない場合を除いて、そのままにしておきます。ギャップを埋めるメリットはありません。

編集#3:

考慮すべきもう1つのこと:何らかの理由で本当に1〜30を維持する必要がある場合は、行を削除しないでください。列を追加して、各行にアクティブまたは非アクティブのフラグを付け、必要なときに非アクティブの行を更新してから、アクティブとしてフラグを付けます。これは非常にハッキーですが、あなたの要件はちょっとハッキーなので...

于 2012-10-19T07:16:31.277 に答える
3

http://sqlfiddle.com/#!8/3f071/1

@x未使用の最小値に設定します。

SET @x = (
  SELECT MIN(t1.id+1)
  FROM      t t1
  LEFT JOIN t t2 ON t2.id = t1.id + 1
  WHERE t2.id IS NULL
);

INSERT INTO t(id) VALUES (@x);

@xギャップ内にある未使用の最小値に設定します。それ以外の場合は、 NULLMySQL の自動インクリメント メカニズムを使用するように戻ります。

SET @x = (
  SELECT IF( MIN(t1.id-1) = 0, NULL, MIN(t1.id-1) )
  FROM      t t1
  LEFT JOIN t t2 ON t2.id = t1.id - 1
  WHERE t2.id IS NULL
);

INSERT INTO t(id) VALUES (@x);

もちろん、自分の足元や好きな場所を撃ちたくない場合は、これらをトランザクションにラップする必要があります。

于 2012-10-19T07:41:03.033 に答える
2

よくAUTO_INCREMENTそのように動作します。削除したデータのギャップを埋めることはありません。あなたができる最善の方法は、あなたのニーズを満たすロジックを作成することです(ギャップを埋める)。

于 2012-10-19T07:16:32.600 に答える