PR

【SQL】TRUNCATE(レコード削除:テーブル再作成)を3分でわかりやすく解説

Database

TRUNCATEは、SQLのデータ操作言語(DML)の一種で、テーブルからすべての行を高速かつ効率的に削除するために使用されます。

TRUNCATEはDELETE文よりも高速ですが、元に戻せない点やトリガーを実行しない点で制限があります。

TRUNCATE TABLE テーブル名;

このページではTRUNCATEの基本、DELETE文との違いをサンプルコード付きで初心者向けにわかりやすく解説します。

このページで学べる内容
  • TRUNCATEの使い方
  • TRUNCATE vs DELETE

プログラマーやエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

スポンサーリンク

TRUNCATE

構文ルール

TRUNCATE TABLE テーブル名;

データ削除をしたいテーブル名を "TRUNCATE TABLE" の直後で指定するだけです。

サンプルコード付きで具体的な使い方を説明しましょう。例えば、次のようなテーブルがあるとします。

product_idnameprice
1Laptop1000
2Smartphone700
3Tablet400
products テーブル

実際にテーブルを作成して実行してみたい方は以下のSQL文を参考にしてください。

-- テーブル作成
CREATE TABLE products (
  product_id INT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  price DECIMAL(10, 2) NOT NULL
);

-- レコード登録
INSERT INTO products (product_id, name, price)
VALUES
  (1, 'Laptop', 1000),
  (2, 'Smartphone', 700),
  (3, 'Tablet', 400);

参考:CREATE TABLE文 / INSERT文

"productsテーブル" からすべての行を削除するには、TRUNCATEを使って次のようなクエリを書きます。

/* 実行前
+------------+------------+---------+
| product_id | name       | price   |
+------------+------------+---------+
|          1 | Laptop     | 1000.00 |
|          2 | Smartphone |  700.00 |
|          3 | Tablet     |  400.00 |
+------------+------------+---------+
*/

TRUNCATE TABLE products;

/* 実行後 Empty set
+------------+------------+---------+
| product_id | name       | price   |
+------------+------------+---------+
|            |            |         |
+------------+------------+---------+

たったこれだけの非常に簡単な構文ですが、いくつか注意すべき点も存在します。

TRUNCATEの特徴と注意点

TRUNCATEは以下のような特徴と注意点を持ちます。

以下の点を考慮して、TRUNCATEを使用するかどうかを判断していきましょう。

TRUNCATE文の特徴と注意点
  • 高速
    TRUNCATEは、テーブルの行を削除する際に、インデックストリガーを更新せず、データファイルとインデックスファイルを直接切り詰めるため、DELETE文よりも高速です。
  • ロールバック不可
    TRUNCATEは通常トランザクションログに記録されないので、ロールバックできません。ただし、一部のデータベースシステム(PostgreSQLなど)では、TRUNCATEをトランザクション内で実行することでロールバックできる場合があります。
  • トリガー非実行
    TRUNCATEは、削除される行ごとにトリガーを実行しません。これが高速化の一因ですが、削除時に実行したいトリガーがある場合は注意が必要です。
  • 参照制約
    TRUNCATEは外部キー制約があるテーブルに対して実行できない場合があります。

まとめると、データの削除が完全である必要があり高速性が重要である場合、TRUNCATEは適切な選択であるが、ロールバック機能やトリガー実行が必要な場合は、DELETE文を使用するのが適切である、ということになります。

TRUNCATE vs DELETE

TRUNCATEとDELETEは、どちらもデータベースからデータを削除するためのSQL文ですが、挙動や特性が異なります。

以下に、それぞれの違いをわかりやすく説明します

TRUNCATE vs DELETE
  • 削除範囲の差異
    • TRUNCATE
      テーブル内の全ての行を削除する→条件を指定して削除することはできない。
    • DELETE
      テーブル内の行を条件に基づいて(WHERE句を使用して)特定の行だけを削除することができる。
  • 速度の違い
    • TRUNCATE
      テーブルのデータファイルとインデックスファイルを直接切り詰めるため、非常に高速に実行される。
    • DELETE
      削除する行ごとにトランザクションログに記録され、インデックスが更新されるため、TRUNCATEよりも遅い。
  • ロールバック
    • TRUNCATE
      トランザクションログに記録されないため、ロールバックができない。
      ※PostgreSQLなどの例外あり
    • DELETE
      トランザクションログに記録されるため、ロールバックが可能。
  • トリガー
    • TRUNCATE
      トリガーを実行しない
    • DELETE
      削除される行ごとにトリガーが実行される

参考 トランザクションとは?

総括すると、TRUNCATEはテーブル内の全てのデータを高速に削除する場合に適していますが、ロールバックやトリガーの実行が必要な場合は適していないといえます。

一方、DELETEは特定の行を削除する柔軟性があり、ロールバックやトリガーの実行が可能。ただし、TRUNCATEよりも速度が遅いというのがポイントです。

どちらを使用するかは、具体的な要件や状況によって決定します。

参考 DELETE文

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

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