SQLite の TRUNCATE TABLE

MySQL や PostgreSQL ではおなじみの TRUNCATE TABLE 構文。
スキーマは変更せず、そのテーブルに存在するデータをバッサリ全削除する時に便利な SQL ですね。
開発段階でテストデータをクリアする際にはしょっちゅう使うし、本番環境でも特に大量データを保持しているテーブルを様々な要因でクリアする必要がある際に重宝します。
まあ、やっていることはいったんテーブルを削除して作り直しているだけですが、手順が増えればミスも増えるので、とてもシンプルに実行できるところが良いです。

しかし、この TRUNCATE TABLE 構文、SQLite では残念ながらサポートされていません。
微妙に不便だな〜と思っていたのですが、実は SQLite の DELETE 文はある条件下では最適化され、 TRUNCATE TABLE に近い挙動になると twitter で教えてもらいました。
その解説が下記。

When the WHERE clause and RETURNING clause are both omitted from a DELETE statement and the table being deleted has no triggers, SQLite uses an optimization to erase the entire table content without having to visit each row of the table individually. This “truncate” optimization makes the delete run much faster.

https://www.sqlite.org/lang_delete.html

詳細は下記をどうぞ。

DELETE

参考までに、教えてもらった twitter は下記です。

ありがたいことです!

上記の twitter にも書かれていますが、テーブルを削除するわけではないので、sequence はリセットされないようです。
逆に言えば、sequence の値を維持したままデータをサクッとクリアできるようなので、むしろ普通の TRUNCATE TABLE よりも便利だと思います。

ということで、結論。
SQLite では、 TRUNCATE TABLE したい時には、DROP TABLE + CREATE TABLE しがちだと思いますが、トリガーなどを設定していない場合には DELETE を使うと良さそうです。

コメント

タイトルとURLをコピーしました