データベースをクリーンに保つ!sqliteで古いレコードを削除する方法と注意点
SQLite で古いレコードを削除する方法
基本的な構文
DELETE FROM テーブル名
WHERE 条件式;
例:
DELETE FROM 商品情報
WHERE 登録日 < '2024-06-17';
このクエリは、商品情報
テーブルから 登録日
が 2024-06-17 より古いすべてのレコードを削除します。
古いレコードを特定するための条件
WHERE
句には、削除するレコードを特定するための条件を指定できます。 以下に、よく使用される条件の例を示します。
- 特定の日付よりも古いレコードを削除する:
登録日 < '2024-06-17'
: 登録日が 2024-06-17 より古いレコードを削除します。更新日時 < '2024-06-17 00:00:00'
: 更新日時が 2024-06-17 00:00:00 より古いレコードを削除します。
- 一定期間経過したレコードを削除する:
登録日 + 30 <= CURRENT_DATE
: 登録日が 30 日以上前のレコードを削除します。更新日時 + 60 * 60 * 24 <= CURRENT_DATE
: 更新日時が 24 時間以上前のレコードを削除します。
注意事項
- データベースを操作する前に、必ずバックアップを取っておきましょう。
DELETE
ステートメントは一度実行すると元に戻せません。 削除するレコードを間違えないように注意してください。- 大量のレコードを削除する場合は、パフォーマンスを考慮する必要があります。 一度に削除するレコード数を制限したり、バッチ処理で削除するなどの対策が有効です。
import sqlite3
# データベースに接続
conn = sqlite3.connect('mydatabase.db')
cursor = conn.cursor()
# 削除対象の日付
target_date = '2024-06-17'
# 古いレコードを削除
cursor.execute(f"""
DELETE FROM 商品情報
WHERE 登録日 < '{target_date}';
""")
# 変更をコミット
conn.commit()
# データベースを閉じる
conn.close()
例:一定期間経過したレコードを削除
import sqlite3
# データベースに接続
conn = sqlite3.connect('mydatabase.db')
cursor = conn.cursor()
# 削除対象の期間(日数)
delete_period = 30
# 削除対象の日付
target_date = (datetime.datetime.now() - datetime.timedelta(days=delete_period)).strftime('%Y-%m-%d')
# 古いレコードを削除
cursor.execute(f"""
DELETE FROM 商品情報
WHERE 登録日 < '{target_date}';
""")
# 変更をコミット
conn.commit()
# データベースを閉じる
conn.close()
- 上記のコードはあくまで例であり、実際の環境に合わせて変更する必要があります。
- 削除対象のテーブル名やカラム名は、ご自身の環境に合わせて変更してください。
VACUUM
コマンドは、データベースファイルを圧縮し、不要なスペースを解放します。 このコマンドを実行すると、削除されたレコードが占めていたスペースも解放されます。
VACUUM;
REINDEX コマンドを使用する
REINDEX
コマンドは、データベースファイルを再構築し、破損を修復します。 このコマンドを実行すると、削除されたレコードも削除されます。
REINDEX;
古いレコードを別のテーブルに移動する
古いレコードを別のテーブルに移動してから、元のテーブルから削除するという方法もあります。
CREATE TABLE 古い記録 (
* -- 元のテーブルと同じカラムをすべて作成
);
INSERT INTO 古い記録
SELECT * FROM 商品情報
WHERE 登録日 < '2024-06-17';
DELETE FROM 商品情報
WHERE 登録日 < '2024-06-17';
トリガーを使用する
トリガーを使用すると、レコードが削除されたときに自動的に古いレコードを削除することができます。
CREATE TRIGGER 古い記録削除
AFTER DELETE ON 商品情報
FOR EACH ROW
BEGIN
DELETE FROM 古い記録
WHERE 登録日 < NEW.登録日;
END;
それぞれの方法の利点と欠点
- VACUUM コマンド:
- 利点:シンプルで使いやすい。
- 欠点:個々の古いレコードを削除することはできない。
- REINDEX コマンド:
- 利点:データベースファイルを修復できる。
- 欠点:処理時間が長い。
- 古いレコードを別のテーブルに移動する:
- 利点:個々の古いレコードを削除できる。
- 欠点:処理が複雑になる。
- トリガーを使用する:
- 利点:古いレコードを自動的に削除できる。
- 欠点:トリガーの作成と管理が複雑になる。
どの方法を選択するかは、
- 削除するレコードの量
- 処理時間
- 必要な機能
sql sqlite