導入
「このテーブル、もう要らない」のと「中身だけ全部消してまっさらにしたい」のは、別の操作です。前者は表ごと消す DROP TABLE、後者は行だけ消す DELETE/TRUNCATE。混同すると、器ごと吹き飛ばして作り直す羽目になります。3つの違いをはっきりさせましょう。
説明
flowchart TB
D1["DROP TABLE t<br/>表そのものを消す<br/>(定義も中身も無くなる)"]
D2["DELETE FROM t<br/>行を消す(表は残る)<br/>WHERE で一部だけも可"]
D3["TRUNCATE TABLE t<br/>全行を高速に消す(表は残る)<br/>※標準SQL。SQLiteには無い"]
| 操作 | 消えるもの | 表の定義 | 一部だけ |
|---|---|---|---|
DROP TABLE t | 表ごと全部 | 無くなる | 不可 |
DELETE FROM t | 行 | 残る | WHERE で可 |
TRUNCATE TABLE t | 全行(高速) | 残る | 不可(全行のみ) |
DELETE ― 行を消す(表は残る)。WHERE を付ければ一部だけ、付けなければ全行が消えます。1行ずつ消してログを残すので、トランザクションで取り消せます。
DELETE FROM temp_log; -- 全行削除(表は残る)
DELETE FROM temp_log WHERE id = 1; -- 一部だけ
TRUNCATE ― 全行を一気に消す。多くの DB(MySQL・PostgreSQL・Oracle 等)にある命令で、DELETE より高速に「全行削除」します。ただし一部だけの削除はできず、多くの環境で自動採番がリセットされ、ロールバックできないこともあります。SQLite には TRUNCATE は無く、DELETE FROM t;(WHERE なし)が実質的にその役割を果たします(SQLite は内部で最適化します)。
DROP ― 表ごと消す。DROP TABLE temp_log; は、行だけでなくテーブルの定義そのものを消します。以後 SELECT * FROM temp_log; はエラー。存在しないときのエラーを避けたいなら DROP TABLE IF EXISTS temp_log; とします。
やってみよう
初期表示のコードを実行し、3件入れた後 DELETE FROM temp_log;(WHERE なし)で「残り件数 0」になることを確認しましょう。表は残っているので SELECT はエラーになりません。次に DROP TABLE temp_log; を実行してから SELECT * FROM temp_log; を試すと、今度は「表が無い」というエラーになります。DELETE と DROP の違いを体感してください。
演習
CREATE TABLE trash (id INTEGER PRIMARY KEY); で作った表を、表ごと消すコマンドを書いてください(中身を空にするのではなく、定義ごと削除します)。
ヒント1を見る
表ごと消すのは DROP TABLE 名前; です。
ヒント2を見る
DROP TABLE trash;(存在しないときに備えるなら DROP TABLE IF EXISTS trash;)