データベースのテーブルの行(レコード)は、DELETE文を使って削除することができます。
1 2 |
DELETE [FROM] テーブル名 [WHERE 削除するレコードの条件] |
テーブルの行をすべて削除する際は、DELETEに続けてテーブル名を指定することで削除できます。
1 |
DELETE [FROM] テーブル名 |
DELETE文を使用してレコードを全件削除してもいいのですが、データベースにはDELETE文以外にもテーブルのデータを一括で削除する方法が用意されています。
そこで今回は、テーブルの全行を一括で削除することができる「TRUNCATE TABLE文」をご紹介します。
目次
全行(全レコード)を削除するテーブルの準備
TRUNCATE TABLE文を使用して、すべての行を削除するためのサンプルテーブルとして、ここでは野菜の情報を管理する「野菜」マスタテーブルを作成します。
野菜マスタテーブルの列定義
野菜マスタテーブルの列定義は、以下のようにします。
列名 | データ型 | 主キー |
---|---|---|
ID | int | 〇 |
名前 | varchar(20) | |
フリガナ | varchar(20) | |
漢字 | varchar(20) | |
英語 | varchar(40) |
野菜マスタテーブルを作成するCREATE文
野菜マスタテーブルを作成するCREATE文のSQLは、次のようになります。
1 2 3 4 5 6 7 8 |
CREATE TABLE 野菜 ( ID int PRIMARY KEY, 名前 varchar(20), フリガナ varchar(20), 漢字 varchar(20), 英語 varchar(40) ); |
野菜マスタテーブルのデータ
野菜マスタテーブルにはサンプルとして、下記のデータを登録します。
ID | 名前 | フリガナ | 漢字 | 英語 |
---|---|---|---|---|
1 | にんじん | ニンジン | 人参 | carrot |
2 | きゅうり | キュウリ | 胡瓜 | cucumber |
3 | たまねぎ | タマネギ | 玉葱 | onion |
4 | かぼちゃ | カボチャ | 南瓜 | pumpkin |
5 | だいこん | ダイコン | 大根 | Japanese radish |
6 | なす | ナス | 茄子 | eggplant |
野菜マスタテーブルにレコードをINSERTするSQL
野菜マスタテーブルに登録するサンプルデータのINSERT文も以下に記載しておきます。
1 2 3 4 5 6 7 8 9 |
INSERT INTO 野菜 (ID, 名前, フリガナ, 漢字, 英語) VALUES (1, 'にんじん', 'ニンジン', '人参', 'carrot'), (2, 'きゅうり', 'キュウリ', '胡瓜', 'cucumber'), (3, 'たまねぎ', 'タマネギ', '玉葱', 'onion'), (4, 'かぼちゃ', 'カボチャ', '南瓜', 'pumpkin'), (5, 'だいこん', 'ダイコン', '大根', 'Japanese radish'), (6, 'なす', 'ナス', '茄子', 'eggplant'); |
上記の野菜マスタテーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。
TRUNCATE TABLE文でのレコードの削除
TRUNCATE TABLE文の構文は以下のようになります。
1 |
TRUNCATE TABLE レコードを全件削除するテーブルの名前 |
TRUNCATE TABLE文はとても簡単です。
「TRUNCATE TABLE」と記述した後にスペース文字列を入れて、すべてのレコードを削除するテーブル名を指定するだけです。
サンプルテーブルの野菜マスタテーブルの全レコードを削除するSQLも掲載しておきます。
1 |
TRUNCATE TABLE 野菜; |
DELETE文とTRUNCATE TABLE文の違いについて
DELETE文ではWHERE句で指定した行(削除対象とする行)のみ削除できますが、TRUNCATE TABLE文では、必ずテーブルにあるすべての行が削除されます。
一般的にTRUNCATE TABLE文では、DELETE文でレコードを削除するよりも高速で処理を行うことができます。
これはログ(削除した記録)を残さずにレコードを削除するからです。
ログを残さずに削除するということは、ロールバック(削除の取り消し)ができないことを意味しています。
TRUNCATE TABLE文はログを残さずに、トランザクション外で処理が行われるため、ロールバックができないようになっています。
ただしSQLServerでは、TRUNCATE TABLE文でもトランザクションをかけることができるので、ロールバックすることが可能になっています。