
掲示板のようなシステムを開発しています。
登校時に記事に投稿ナンバーが割り当てられますが、記事を削除したときにこの投稿ナンバーを更新させたいのです。
どういうことかといいますと、投稿ナンバーが1~10の記事があったとします。そこれ4~7の記事を削除すると、残りの記事数は6つとなり、記事ナンバーは上から1,2,3,8,9,10となり、連番ではなくなってしまいます。今後このデータベースを利用するに当たって、この数字が連番になっていないと困ります。
そこで、記事が削除されたときに投稿ナンバーをチェックし、間違っていたら数値を更新させたいのです。先ほどの例ですと、8,9,10を4,5,6にしたいのです。
検索してみた結果、データの更新(上書き)にはUPDATE構文を使えば良いそうですが、これを1行ずつ実行させる方法が分かりません。limit文は引数が1つしか使えないため、0番目からn番目の要素すべてを一気に検出・置換してしまいます。
このような問題にどのようにして対応すればよいのか、皆様の知恵をお貸しください。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
がると申します。
時々拝見するタイプの質問なのでちと気になるのですが。
その「投稿ナンバー」は、テーブルのプライマリキーになってないでしょうか?
それ次第で大分かわるので。
ただ、いずれにしても「かならず連番である必要がある」設計は、それ自体にミスがあることが多いです。
No.1
- 回答日時:
過去にさかのぼって毎回レコードを直すのは
非効率的だと思います。たとえば古い1件の修正を
するためにその後の登録分何万件もの修正が発生する
可能性もあり、その運用方法は致命的かもしれません。
とりあえず、どうしてもというなら
set @no=0;
update `table` set `投稿ナンバー`=@no:=@no+1
などでいけそうですが、表示順の保障がないので、
もうすこし工夫が必要かもしれません。
そもそも「数字が連番になっていないと困る」状況と
いうのが理解できません。単に序列がひつようなだけ
であれば連番の意味はあまりないかと。
またどうしても連番にしたいということであれば
連番を管理するための専用のテーブルを用意し、
検索時にINNER JOINするのがもっとも効率的かと
おもいます。
この回答への補足
回答ありがとうございます。
おっりゃるとおり、確かに場合によっては何万件もの修正が必要になるかもしれませんが、あくまで掲示板製作の実験ですので、投稿数に上限(最高でも300件とか)をつけることによってカバーできるものと思い、製作しておりました。
CGIの掲示板などで投稿が削除された後、欠番が何らかの方法で埋められて、結果記事ナンバーが連番になっている(表示順は違う場合あり)ものを見かけたので、どのようにして実行させているのか気になって質問しました。
お教えいただいた方法も試してみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
エラー 1068 (42000): 複数の主...
-
selectした大量データをinsert...
-
select文のwhere句に配列を入れ...
-
期間の重複を調べるSQL文につい...
-
バインド変数について
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
[MySQL] 3つのテーブルの結合で...
-
WordpressのContact form 7でzi...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
最小値をUPDATE
-
上位3位を求めるSQL文は?
-
ローカルルーターモードとは
-
updateを1行ずつ実行したい。
-
Postgreのupdateコマンドでエラー
-
ある条件の最大値+1を初番する...
-
少し前に放送されていたオムツ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
WordpressのContact form 7でzi...
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
クエリ表示と、ADOで抽出したレ...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
SQL Left Join で重複を排除す...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] UNIQUE制約の値を更新...
-
inner joinをすると数がおかし...
-
1テーブル&複数レコードの更新...
-
Access パラメータクエリをcsv...
-
期間の重複を調べるSQL文につい...
-
Unionした最後にGROUP BYを追加...
-
Updateの複数テーブル条件時のL...
おすすめ情報