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
詳細は下記をどうぞ。
参考までに、教えてもらった twitter は下記です。
ありがたいことです!
上記の twitter にも書かれていますが、テーブルを削除するわけではないので、sequence はリセットされないようです。
逆に言えば、sequence の値を維持したままデータをサクッとクリアできるようなので、むしろ普通の TRUNCATE TABLE
よりも便利だと思います。
ということで、結論。
SQLite では、 TRUNCATE TABLE
したい時には、DROP TABLE + CREATE TABLE
しがちだと思いますが、トリガーなどを設定していない場合には DELETE
を使うと良さそうです。
コメント