本文へスキップ
BecomeCoder

SQL テーブル設計 (DDL)コース · 第3章 正しく消す・作り直す · レッスン12

DROP と TRUNCATE ― 「表を消す」と「中身を空にする」

ブラウザで完結

導入

「このテーブル、もう要らない」のと「中身だけ全部消してまっさらにしたい」のは、別の操作です。前者は表ごと消す DROP TABLE、後者は行だけ消す DELETETRUNCATE。混同すると、器ごと吹き飛ばして作り直す羽目になります。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;

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。