DB及びSQLに詳しい方、教えてください。
sqliete3を使ってます。
insertしたレコードをdeleteしても.dbファイルのサイズは小さくならない
様なので、テーブルのカラムに削除フラグを設けて、削除はdeleteコマン
ドでレコードを削除する代わりに、フラグのupdateとし、
レコード挿入の場合は、フラグが立ってるレコードを見つけて、そのコー
ドを更新(フラグが立ってるレコードが無い場合はinsert)とする仕様に
してみようかと考えてます。
もちろんselect時は、フラグの立ってるレコードをwhere句で除外するつも
りです。
そこで、質問なのですが、フラグの立ってるレコードを一つselectして該
当レコードをupdateするには、どのようなSQLになるでしょうか?
フラグが立つレコードは複数もしくは無い事が考えられるので、例えば、
update table01 set col = 'hogehoge' where flag = 1;
では上手く機能しないと考えます。
複数レコードが選択された場合は、任意のレコードを選んで更新、また、
レコードが一つも選択されなかった場合の条件判定(後のinnsert)は、
どのように記述したらよいのでしょうか?
※そもそも、そんな事しなくても他にもっと良い方法があるよ。
といった場合は、その方法を伝授してください。
それでは、ご指導のほど、宜しくお願いいたします。
No.1ベストアンサー
- 回答日時:
素直にvacuum
No.2
- 回答日時:
mattalixさんが回答されているとおりですが、
SQLite、PostgreSQLなどの追記型のデータベースは、deleteで論理削除し、vacuumで物理削除するしくみです。
(ちなみに、PostgreSQLは、
vaccumで、deleteを再利用可能領域に変換する=>ファイルサイズ変更なし、
vaccum fullで、ファイルサイズ詰めです。SQLiteは、vaccumでファイル
サイズも小さくなります。)
「deleteの後のトリガーに登録」?ということについては、
SQLiteをどのようなケースでご利用されているか、
(デスクトップアプリケーションの組込みDBか、Webアプリケーションのバックエンドか)わかりませんが、
deleteした時に、物理ファイル内のデータも削除しなくてはならないなど
特別な理由がない限り、vacuumの処理は、deleteのタイミングごとに行うというよりも、むしろデータベースのメンテナンスとして定期的にバッチ処理で行うのが一般的かと思います。
(vaccum処理対象のレコード数が多いと、それなりに処理に時間がかかるためです。)
つまり、デスクトップアプリケーションならば、アプリ起動時や終了時に自動実行するか、ユーザがメニューから「最適化」処理として呼び出せるようにする、Webアプリケーションならば、サイトのメンテナンス日などにスケジューラで実行させる(Linuxならばcron、Windowsならばタスクから、vaccum処理を記載したプログラムを呼び出す)などです。
この回答への補足
copymasterさん、ご回答有難うございました。
>(vaccum処理対象のレコード数が多いと、それなりに処理に時間がかかるためです。)
つまりは、sqlite3はvacuum処理中はトランザクション(selectやupdate,delete)を受け付けないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- MySQL SQLでカラムを追加し、条件に合致した場合にフラグ(レコード)を付与する方法 2 2022/05/18 23:54
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- ドメイン・サーバー・クラウドサービス 独自ドメインでのNSレコード設定 1 2023/07/12 18:36
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フラグをたてるってどういうこ...
-
SQLで一定時間周期毎の抽出方法...
-
カラムに設定した日付が24時間...
-
【SQL】他テーブルに含まれる値...
-
ADO+ODBCでテーブルに接続する...
-
Accessの構成をコピーしたい
-
SELECTした結果に行番号を求めたい
-
Oracleのリンクテーブルの「精...
-
SELECTした結果をSELECTしたい!
-
オラクルのUPDATEで複数テーブル
-
SELECT INTOで一度に複数の変数...
-
既存データをINSERT文にして出...
-
truncate tableを使って複数の...
-
エクセルVBA 10分後にエクセル...
-
結合したテーブルをSUMしたい
-
Access にて "mm:ss.0" 形式の ...
-
既にテーブルが存在する場合の...
-
ACCESSのVBAにてExcelに行...
-
データベース ユーザの「このユ...
-
ExcelのVLOOKUP関数の動作をMyS...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フラグをたてるってどういうこ...
-
SQLで一定時間周期毎の抽出方法...
-
カラムに設定した日付が24時間...
-
【sqlite3】deleteしても.dbフ...
-
access vba での left join に...
-
フラグってどういう意味ですか...
-
フラグの文字型は?
-
Excel 複数のセルが共に一致す...
-
メッセージにフラグが保存され...
-
Accessのクエリ抽出
-
【エクセル/excel】if関数とフラグ
-
片方のテーブルに存在しないレ...
-
フラグってなんですか
-
sqlでのデータ抽出について
-
selectによるレコード取得結果...
-
下4桁を*表示
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
テーブル名が可変の場合のクエ...
おすすめ情報