いつも参考にさせて頂いています。
MySQL(OS:Windows)でDBを作っていますが、ある問題で詰まってしまいましたので識者の方の意見を伺えればと考えました。
問題は、インデックス(1で開始され、あとは+1ずつ増加)をキーとしたデータが登録されているテーブルがあります。
このテーブルのデータは削除・追加が行われます。削除の際は当然そのインデックスが欠番となり、追加時は欠番があればそちらを使用したいのですが、欠番を求める巧いSQLが思い浮かびません(パッと考え付くのは欠番テーブルを作る事位です…)。
如何せんDB・SQL経験が浅いためDB設計の考え方がおかしいのかもしれません。この点も含め上記問題の解決方法のヒントを教えて頂ければ幸いです。
No.2ベストアンサー
- 回答日時:
今、テーブルを t 、インデックスを i とします。
このとき、
次のSQLで、最小の欠番を取得できます。
SELECT MIN(T0.i) + 1 FROM t AS T0 LEFT JOIN t AS T1
ON T0.i + 1 = T1.i WHERE T1.i IS NULL;
これは、4.0でも動きます。
masayuki0511さん遅くなってしまいましたが、回答ありがとうございます。
しかも丁寧なSQL、対応バージョンまで…ひたすら感謝です。
LEFT JOINは不慣れだったためパっと出てきませんでしたが、知人に聞いてどう動くのかが判りました。ちょっと変えると欠番の最大値も求められる便利なSQLですね。ありがとうございました。
No.1
- 回答日時:
私がぱっと考えて一番単純なのは、削除時はDELETEでなく削除フラグを立てて、新規時に削除フラグの立っている小さい順にUPDATE か DELETE&INSERT かな?
select min(インデックス) from table where 削除フラグ
レコードが取得できれば 取得したインデックスを使用。
レコードが取得できなければ MAX+1 で登録。
同じような処理をやってるとこも多そうなので、実際にやったことある人の意見を聞いた方が良いかもですね。
vivletさん、回答ありがとうございます。
なるほど削除時にDELETEしない方法は気づきませんでした。発想の転換が必要だったことを思い知ります。MySQLで差集合をとる方法を必死で考えていた5分前の自分に教えてやりたい位です(^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- システム 帳票出力を行う単体テストのテストデータが作成できません 2 2023/08/26 21:26
- IT・エンジニアリング 帳票出力を行う単体テストのテストデータが作成できません 2 2023/08/26 21:25
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- MySQL SQLで日付別のIDを生成するには 3 2022/10/09 10:34
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Excel(エクセル) Excelでデータを抽出するに良い方法 9 2023/02/06 12:42
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PhpMyAdminで作成して実行せよ...
-
WHERE `年月日` = '晴' OR `年...
-
SQLでカラムを追加し、条件に合...
-
下の画像はSQLの4大命令の性質...
-
参考書に従って入力したつもり...
-
SQLです。こんな感じですか?あ...
-
#1062 - '0' は索引 'PRIMARY' ...
-
あってますか?SQL
-
2023年10月25日現在のMAMP ...
-
mysqlがインストールされている...
-
テーブル名が可変の場合のクエ...
-
エラー 1068 (42000): 複数の主...
-
MySQLでcreateが使えない MySQL...
-
【初歩】ラジオボタンをつかっ...
-
sqlにおけるテーブル名と各カラ...
-
MySQLの「zaiko」テーブルを作...
-
int(11)の(11)とは何を意味して...
-
SQLです教えてくださいお願いし...
-
SQLを作ったのですがうまくいき...
-
(初心者)MySQLやmaraDBで、crea...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
巨大テーブルからインデックス...
-
インデックスを削除したいので...
-
DB2(OS/390)のSECQTYについて
-
インデックス再構築中のSELECT
-
インデックス名の重複(MySQL5.1...
-
トップと同階層にあるファイル...
-
数百ページあるPDFをWebで公開...
-
Access 重複する値を制限したい
-
複合インデックス
-
INDIRECT関数の代替方法は?
-
DBの定義のサイズを大きくし過...
-
SELECT文で、指定カラム以外の...
-
一部のカラムでdistinctし全て...
-
LIKEの右側にカラムを指定でき...
-
UNIONする際、片方テーブルしか...
-
GREATESTで NULLをスルーする方...
-
now()かCURRENT_TIMESTAMPか
-
SQLServerでNULLを挿入したいです
-
テーブルの列数を調べたい
-
SQLでカラムを追加し、条件に合...
おすすめ情報