テーブルの内のレコードをすべて削除するには、最初に掲げたDELETE命令を使う他にTRUNCATE TABLE命令を使う方法もあります。
- DELETE命令 -
テーブル内のレコードをすべて削除するには、DELETE文を使う他にTRUNCATE TABLE命令を使う方法があります。書式は単純で、以下のようにテーブル名を記述するだけです。
TRUNCATE TABLE <テーブル名>
DELETE命令とTRUNCATE TABLEの両方を実行してみましょう。まずDELETE命令から実行します。
DELETE 商品_dmy
しかしこの文を実行すると、先に述べたようにレコードがすべて削除されてしまいます。それでは同じテーブルのレコードをTRUNCATE TABLEで再度削除できないので、元に戻せるよう安全策を講じておきましょう。SQLを以下のようにします。
BEGIN TRANSACTION
DELETE 商品_dmy
このSQLを実行すれば、「商品_dmy」の内容はすべて削除されます。
- TRUNCATE TABLE命令 -
さて、今度はTRUNCATE TABLE命令による削除を試してみましょう。その前に、削除対象である「商品_dmy」内のレコードを元に戻しておかなければなりません。以下のSQLを実行します。
ROLLBACK TRANSACTION
これで、削除されたテーブル「商品_dmy」内のレコードはすべて元に戻ります。
続いて以下のSQL(07.sql)を実行します。
BEGIN TRANSACTION
TRUNCATE TABLE 商品_dmy
やはり同じように、テーブル内のレコードはすべて削除されます。そして以下のようにすると、削除された「商品_dmy」内のレコードは復元されます。
ROLLBACK TRANSACTION
- 両者の違い~処理速度 -
DELETEとTRUNCATE TABLEによるレコードの削除は、どちらも同じ結果をもたらします。つまりTRUNCATE TABLE命令は、WHERE句を伴わない(削除対象のレコードを絞り込まない)DELETE命令と機能的にはまったく同じだということです。
では、なぜ2通りの削除方法があるのでしょう?
DELETE命令は、基本的にWHERE句を使って削除対象のレコードを絞り込む――という使い方をします。そのためDELETE命令ではたとえ全行削除の場合でも、1行ずつレコードを削除していきます。
対してTRUNCATE TABLE命令は全行削除の機能しか持っていないため、テーブルのレコードを記録する領域(データページ)の割り当てを解除して一気にレコードを消滅させます。従って、TRUNCATE TABLEの方がDELETEより高速に削除できます。
- 両者の違い~IDカウンタの初期化 -
また、DELETE命令とTRUNCATE TABLEではIDカウンタの扱いが異なります。IDカウンタはレコードを一意に特定するIDフィールドで用いられるため、IDフィールドを自動増加(Accessでいうオートナンバー型)に設定していた場合、削除後にレコードを追加した時の振る舞いが異なります。
DELETEではIDカウンタの値は削除前のまま据え置かれますが、TRUNCATE TABLEでは初期化されます。従って、DELETEで削除したテーブルに新しいレコードを追加すると、IDフィールドの値は削除前の最終レコードの値から続けられますが、TRUNCATE TABLEで削除後にレコードを追加すると、IDフィールドの値は初期値にリセットされます。
テーブル構造などテーブルの外枠も含めてすべてを削除したい場合は、DROP TABLE命令を使います。
DROP TABLE <テーブル名>
この場合、テーブルそのものが削除されてしまうため、同じテーブルを利用するときには、CREATE TABLE命令またはSELECT~INTO命令で新たにテーブル構造自体を生成しなければなりません。 |
|
|
|