データベース千夜一夜第8回

データの加工命令(2)~レコードの削除と削除処理の注意点 長谷川裕行
有限会社 手國堂

全行削除の2つの命令

テーブルの内のレコードをすべて削除するには、最初に掲げた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命令で新たにテーブル構造自体を生成しなければなりません。



トップページ
レコードの削除~DELETE命令
特定のレコードを削除する
全行削除の2つの命令
DELETE命令
TRUNCATE TABLE命令
両者の違い~処理速度
両者の違い~IDカウンタの初期化
DELETEとTRUNCATE TABLEの違いを試す
トランザクションの制御について
あとがき
Copyright © MESCIUS inc. All rights reserved.