こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP MySQL自動連番で削除された場合

PHPとMySQLでサイトを作っています。

ページングしたページで”次へ”と言うリンクをpidに+1と言う形で実装してるのですが

もしデータを削除して自動連番の値が中抜けしてしまった場合そのリンクが無効って事になってしまいます。


アクセスされる度にオートインクリメントの番号を振り直すみたいな事とか出来るんでしょうか?
連番削除で中抜けが出来てしまうのは回避出来ないでしょうか?

それともPHPのプログラミングで上手に回避出来る方法があれば教えて下さい。

知恵を貸して下さい。

お願いします。

投稿日時 - 2012-01-11 23:19:09

QNo.7239201

すぐに回答ほしいです

質問者が選んだベストアンサー

適切なソートオーダーを設定した上で、LIMIT節を指定してください。

オートインクリメントを設定するという事は、主キーとして使用しているはずです。
主キーを振り直すということは、別テーブルにリンクがあった場合その値もすべて振り直しをするという事になります。
DBの再構築のようなものですね。

データの削除ごときで、DB再構築をしなければならないなんてのは、設計が間違っていますね。
また、説明を読む限り現在適切なソートオーダーも指定されていないようですね。
IDはソートオーダーとして使用するには適切とは言えません。
たとえば新規ページを特定のページの後に追加したいという事で、DB再構築となるのはやはり設計が間違っています。

極論で言えば、ID(主キー)はただのレコードを特定するだけの値であって、それ以外の意味(並び順など)の意味を持たせてはいけません。連番である事を期待してもいけません。

ま、職業プログラマでもDB設計に慣れていないのか、IDの欠番が気に食わないとIDのふり直しをゴリゴリプログラムしているシステムや、IDをソートオーダーとして利用している為に新規データを途中に登録する場合、全DB登録をやり直しというシステムを見た事はあります。
バグの元、ユーザの操作ミスの元でしかありませんね。

投稿日時 - 2012-01-12 00:13:43

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

pidに+1というロジックが間違っています。
自ページのpidより小さくて一番大きいのが前のページのpid
自ページのpidより大きくて一番小さいのが次のページのpid
などのようにすればよいでしょう。

>オートインクリメントの番号を振り直す

そんなことをするためにオートインクリメントがあるわけではありません。
ユニークで順序のあるidをはくためのものなので中抜けがあっても
問題ありません。
むしろidを振りなおしてしまうことはそのページを特定する番号を
変えてしまうことなので問題が大きくなるだけです。

投稿日時 - 2012-01-12 00:12:29

あなたにオススメの質問