現在、PHPとMySQLを使用して予約システムを作っているのですが、レコードのID=2をdelete文で削除して、insert文で作成したらID=3でレコードが作成されるのですが、このままでは、IDが増え続けてしまうので、それを直したいのですが、いい方法はありますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
4
IDとはそういうものです。間を詰めてしまうと、指定したIDで別のレコードが
ヒットしてしまいシステムとしては最悪です。
ただしもしどうしてもやりたいならできないことはありません。
SQL
1create table hoge(id int not null unique); 2insert into hoge values(1),(2),(3),(7),(10); 3update hoge set id=(select @a:=@a+1 from ( select @a:=0) as dummy ) order by id;
投稿2016/09/07 02:49
総合スコア116895
2
IDはURLや他のデータとも深く関わることが多いので、再利用をするデメリットが大きいです。
分かりやすいところだと、そのIDが含まれるURLをブックマークしておいたのに、再度訪れたらIDが再利用されて別のデータが表示されてしまうことが考えられます。w
そのため、確たる理由が無い限りは気にしないというのが一般的なアプローチかと思います。
どうしても嫌な場合は、
autoincrementをオフにしてデータ投入時に空きIDを自力で探して指定する。
データ削除時にそれ以降のデータのIDをアップデートして詰める
実IDとは別に表示用のIDを持たせて、それを上記の方法でアップデートする
等の方法があるかと思いますが、どれもとても面倒で、パフォーマンスにも深刻な影響が出る可能性があります。
投稿2016/09/07 02:57
総合スコア18728
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2
気にしないことをおすすめします。
削除する前のレコードと、新たに追加したレコードは、もはや同じものではないので、IDが同じであるほうが不自然です。その考え方を受け入れるべきです。
どうしても、というなら、やり方はあります:
http://dev.mysql.com/doc/refman/5.6/ja/alter-table.html
新しい行に使用される AUTO_INCREMENT カウンタの値を変更するには、次のようにします。
ALTER TABLE t2 AUTO_INCREMENT = value;
投稿2016/09/07 02:49
編集2016/09/07 02:50総合スコア2493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
それはそのままの方がいいと思いますよ。。
9月1日にはID:1は山田さんのデータだったのに、9月2日にはID:1は佐藤さんのデータになっているという事が発生するわけですよね?
投稿2016/09/07 02:56
編集2016/09/07 04:21総合スコア5405
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そもそも、なぜ空いた番号を詰めたいのでしょうか。
- 飛んでいると気持ち悪い→その気持ちを捨ててください。データベースエンジンによっては、途中で削除しなくても番号が飛ぶことがあります。
- 番号の消費が心配→IDの桁数を増やしてください。32ビットであれば43億個、64ビットなら1800京個(符号付きならその半分)ありますので、実用上不足する心配はしなくて構いません。
- 何かの処理がIDの連続性に依存している→そちらの処理を直してください。上でも触れたように、IDの連続性は(削除しなかったとしても)保証されません。
投稿2016/09/07 02:51
総合スコア146129
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。