
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データベースファイル(.db)を開...
-
DBエラーを解決したい
-
Accessを開きなおすとテキスト...
-
半角ハイフンに似た文字
-
汎用カード型のデータベースソ...
-
ポストグレでお聞きしたいです。
-
manana というやつで、間違って...
-
Accessフォームで平均値の出し...
-
データベースの勉強 公務員を目...
-
はじめてのAccess 2019 について
-
ITパスポートについての質問で...
-
マイクロソフトAccessでsqlのas...
-
情報整理するのに、「 Fullfree...
-
レコード数のカウント
-
私はシステム会社に務めている...
-
データベースの選定について 要...
-
ドリームメーカーってどうやっ...
-
Accessのフォームへ、記録者の...
-
エクセル
-
コンピュータ用語、データベー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フラグをたてるってどういうこ...
-
SQLで一定時間周期毎の抽出方法...
-
フラグの文字型は?
-
フラグってなんですか??
-
MYSQLデータの書き換えについて
-
片方のテーブルに存在しないレ...
-
phpmyadmin 2.6.4-pl4 (MySQL3....
-
Access演算コントロールについて
-
SQLの結合
-
初心者です
-
フラグってどういう意味ですか...
-
access vba での left join に...
-
【sqlite3】deleteしても.dbフ...
-
selectによるレコード取得結果...
-
下4桁を*表示
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
SQLサーバに対するSQL文で抽出...
-
UPDATEで既存のレコードに文字...
おすすめ情報