| この記事の要点 |
|
TRUNCATE TABLE とは
TRUNCATE TABLE は、表に入っているデータをすべて削除し、表の構造(カラム定義・インデックス・制約)はそのまま残す SQL です。「中身を空にして作り直したい」ときに使います。
-- 基本形
TRUNCATE TABLE users;
-- Oracle / PostgreSQL では TABLE を省略できない DB もあるが
-- MySQL は TABLE を省略しても動く
TRUNCATE users;
DELETE / TRUNCATE / DROP の違い
この 3 つは「消す」という点では同じですが、何が残るかと取り消せるかが違います。ここを取り違えると本番でデータを失います。
| 観点 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 分類 | DML | DDL | DDL |
| 表の定義 | 残る | 残る | 消える |
| データ | 条件に合う行 | 全行 | 全行 |
| WHERE で絞る | できる | できない | できない |
| ROLLBACK | できる | 原則できない | 原則できない |
| 速度 | 行数に比例して遅い | 速い | 速い |
| トリガ | 動く | 動かない | 動かない |
| AUTO_INCREMENT | 継続 | 1 に戻る | (表ごと消える) |
使い分けの目安は次のとおりです。一部だけ消すなら DELETE、全部消して同じ表を使い続けるなら TRUNCATE、表そのものが不要なら DROP。テストデータの入れ直しや、日次で洗い替えする中間テーブルの初期化は TRUNCATE の典型的な出番です。
ROLLBACK で戻せない
いちばん事故が多いのがここです。TRUNCATE は多くの DB で DDL として扱われ、実行時に暗黙のコミットが走ります。トランザクションの中で実行しても、ROLLBACK で元に戻せません。
-- MySQL / Oracle: これは戻せない
START TRANSACTION;
TRUNCATE TABLE users; -- ここで暗黙コミットが走る
ROLLBACK; -- 効かない。users は空のまま
-- DELETE なら戻せる
START TRANSACTION;
DELETE FROM users;
ROLLBACK; -- 元に戻る
| DBMS | トランザクション内での TRUNCATE |
|---|---|
| MySQL | 暗黙コミット。ROLLBACK で戻せない |
| Oracle | 暗黙コミット。ROLLBACK で戻せない |
| SQL Server | トランザクション内なら ROLLBACK できる |
| PostgreSQL | トランザクション内なら ROLLBACK できる |
MySQL と Oracle では取り消せないので、実行前にバックアップを取るのが前提になります。SQL Server と PostgreSQL は戻せますが、他の DB へ移植したときに前提が崩れるため、頼りきらないほうが安全です。
外部キーがあると失敗する
その表が他の表から外部キーで参照されている場合、TRUNCATE は拒否されます。参照している側に孤立した行が残ってしまうためです。
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint
(MySQL の例)
対処は 3 つあります。
| 方法 | 内容 | 注意 |
|---|---|---|
| 子から先に消す | 参照している側の表を先に TRUNCATE する | いちばん安全 |
| DELETE を使う | DELETE FROM users; に置き換える | 遅いが確実。ON DELETE CASCADE も効く |
| 制約を一時無効化 | MySQL なら SET FOREIGN_KEY_CHECKS = 0; | 整合性が壊れる恐れ。作業後に必ず 1 に戻す |
PostgreSQL には TRUNCATE parent, child CASCADE; のように、参照している表もまとめて空にする構文があります。強力なぶん、意図しない表まで空になっていないか実行前に確認してください。
AUTO_INCREMENT / シーケンスの挙動
連番カラムの扱いも DELETE と違います。TRUNCATE は採番を初期値に戻します。
-- MySQL
INSERT INTO t (name) VALUES ('a'),('b'),('c'); -- id = 1,2,3
DELETE FROM t;
INSERT INTO t (name) VALUES ('d'); -- id = 4 (続きから)
TRUNCATE TABLE t;
INSERT INTO t (name) VALUES ('e'); -- id = 1 (1 に戻る)
PostgreSQL では既定で採番が戻らないため、戻したい場合は TRUNCATE t RESTART IDENTITY; と書きます。テストの再現性を保ちたいときはこの違いが効いてきます。
権限とレプリケーション
TRUNCATE は DDL なので、必要な権限も DELETE とは別です。MySQL では DROP 権限、Oracle では DROP ANY TABLE(自分のスキーマ外の場合)が要ります。「DELETE はできるのに TRUNCATE で権限エラーになる」場合はここを疑ってください。
レプリケーション環境では、TRUNCATE は 1 文としてレプリカに伝わるため、数百万行の削除でもバイナリログはほとんど増えません。同じことを DELETE でやると全行が行イメージとして記録され、ログが膨らんでレプリカ遅延の原因になります。大量データの全削除は TRUNCATE のほうがレプリケーションにやさしい、という判断材料になります。
FAQ
Q: TRUNCATE したデータは復旧できますか?
A: MySQL / Oracle では ROLLBACK では戻せません。バックアップかバイナリログ / REDO ログからの復旧になります。作業前のバックアップが唯一の保険です。
Q: 一部の行だけ消したいのですが
A: TRUNCATE に WHERE はありません。DELETE FROM t WHERE ... を使ってください。
Q: TRUNCATE のあと領域は解放されますか?
A: MySQL の InnoDB で innodb_file_per_table が有効なら、表ファイルが作り直されてディスクが解放されます。共有テーブルスペースの場合は、ファイルサイズは縮みません。
Q: 全部の表をまとめて空にしたい
A: 外部キーの依存順に注意しながら 1 表ずつ実行します。順序が面倒な場合は、参照している側から先に消すか、DELETE と ON DELETE CASCADE に切り替えるのが確実です。
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- djangoのテンプレートの作成とヘッダー・フッターの共通化 2026-10-03 21:41:49
- テンプレートフラグメント(ヘッダー等の共有化) 2026-10-03 21:41:49
- reCAPTCHA v3 使い方(サンプル付き) 2026-10-03 21:37:05
- Content-Type一覧|MIMEタイプとはとHTTPでの主な使用場面 2026-10-03 21:37:05
- SpringにおけるAOPの使い方 2026-10-03 21:37:05
- X (Twitter) API でツイートできないがエラーが出ない問題の原因と対処 2026-10-03 11:33:01
- X (Twitter) API アプリケーション登録完全ガイド|v2・Bearer Token・OAuth 2.0 PKCE 2026-10-03 11:33:01
- X (Twitter) API 完全ガイド|従量課金の料金・単価(2026年10月)と v2 移行 2026-10-03 11:32:40
- Google DeepMind とは?Gemini・AlphaFold の開発元 2026-10-03 11:26:56
- Cursor とは?AI 統合型コードエディタの使い方・料金 2026-10-03 11:26:56
- Claude (Anthropic) とは?AIチャットの使い方・モデルファミリ・API 2026-10-03 11:26:56
- AIベンダー一覧:OpenAI・Anthropic・Google DeepMind・Microsoft・Meta 2026-10-03 11:26:56
- クラウド・インフラ完全ガイド — AWS/Azure/GCP/Kubernetes 2026-10-03 11:26:56
- テキストエディタ完全比較 (VS Code / Cursor / Vim / Emacs / IDE) 2026-10-03 11:26:56
- プログラミング学習プラットフォーム|Scratch・micro:bit ほか 2026-10-03 11:26:56