ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 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-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Javaの定数 2026-09-07 07:45:13
- Laravel 記事一覧55件|環境構築・ルーティング・DB・エラー対処 2026-09-07 07:45:13
- hostnameコマンドの使い方|Windows・Linux・macOSでホスト名確認 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Spring Framework 記事一覧31件|DI・設定・例外の対処 2026-09-07 07:45:13
- Oracle DROP USERでユーザー削除|CASCADE・接続中ユーザーの対処 2026-09-07 07:45:13
- SQLとは|DDL・DMLとリレーショナルデータベース操作の基本 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- NetBeansでTomcatを起動する手順|サーバ登録・ポート・トラブル対処 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?