全てのデータを削除する(TRUNCATE TABLE文)
MySQL では TRUNCATE TABLE 文を使用することでテーブルに格納されているデータをすべて削除することができます。ここでは MySQL ですべてのデータを削除する方法について解説します。 DELETE 文を使って削除する場合との違いについても解説します。
(Last modified: )
すべてのデータを削除する
テーブルに格納されたデータをすべて削除するには TRUNCATE TABLE 文を使用します。書式は次の通りです。
TRUNCATE [TABLE] tbl_name
指定したテーブル名( table_reference )に格納されているデータをすべて削除します。
全てのデータを削除するには DELETE 文を使って DELETE FROM tbl_name でも同様のことが行えます。ただ DELETE 文がデータを 1 つずつ削除するのに対して、 TRUNCATE TABLE 文の場合はテーブルをいったん削除して改めてテーブルを作成するためテーブルに格納されているデータが非常に多い場合には高速で行える場合があります。また他にも異なる点があるのでのちほど解説します。DELETE 文については「データを削除する(DELETE文)」を参照されてください。
-- --
それでは実際に試してみます。次のようなテーブルを作成しました。
create table user (id int, name varchar(10));
テーブルには次のようなデータを追加しました。
insert into user values (1, 'Yamada');
insert into user values (2, 'Suzuki');
insert into user values (3, 'Honda');
insert into user values (4, 'Kuwata');
現在テーブルに格納されているデータを取得して確認しておきます。
それではテーブルに含まれるすべてのデータを削除します。次のように実行してください。
truncate table user;
すべてのデータの削除が完了しました。それではあらためてテーブルの値を取得してみます。
すべてのデータが削除されてテーブルにはデータが格納されていないことが確認できました。
データを削除したあとAUTO_INCREMENTがリセットされる
テーブルのカラムに AUTO_INCREMENT が設定されていた場合、 TRUNCATE TABLE でデータを削除すると AUTO_INCREMENT で次に自動で設定される値がリセットされて 1 から再び始まります。それに対して DELETE 文でデータを削除した場合には AUTO_INCREMENT はリセットされません。
実際に試してみます。最初に TRUNCATE TABLE でデータを削除した場合です。次のようなテーブルを作成しました。
create table user(id int auto_increment, name varchar(10), index(id));
テーブルには次のようなデータを追加しました。
insert into user (name) values ('Yamada');
insert into user (name) values ('Suzuki');
insert into user (name) values ('Honda');
id カラムには AUTO_INCREMENT が設定されているので、 1, 2, 3, ... と順番に値が格納されています。
それではいったんテーブルに含まれるすべてのデータを削除します。次のように実行してください。テーブルのデータを取得してみると、すべてのデータが削除されていることが確認できます。
truncate table user;
ここであらためてデータを追加していきます。 TRUNCATE TABLE 文でテーブルのデータを削除した場合には AUTO_INCREMENT がリセットされるので、 AUTO_INCREMENT が設定されている id カラムには 1, 2, 3, ... と順番に値が格納されています。
insert into user (name) values ('Yamada');
insert into user (name) values ('Suzuki');
insert into user (name) values ('Honda');
-- --
では次に DELETE 文でデータを削除した場合です。現在テーブルにデータが3つ格納されていますので、次のように DELETE 文を使ってデータをすべて削除します。テーブルのデータを取得してみると、すべてのデータが削除されていることが確認できます。
delete from user;
ここであらためてデータを追加していきます。 DELETE 文でテーブルのデータを削除した場合には AUTO_INCREMENT がリセットされませんので、 AUTO_INCREMENT が設定されている id カラムには今までテーブルに格納された id カラムの一番大きい値が 3 でしたので 4, 5, 6, ... と順番に値が格納されています。
insert into user (name) values ('Yamada');
insert into user (name) values ('Suzuki');
insert into user (name) values ('Honda');
TRUNCATE TABLE 文でデータを削除した場合と DELETE 文でデータを削除した場合で AUTO_INCREMENT の扱いの違いについて解説しました。
DELETEトリガーが起動しない
テーブル DELETE トリガーが設定されていた場合、 DELETE 文を使ってデータを削除した場合にはトリガーが起動しますが、RUNCATE TABLE 文でデータを削除した場合にはトリガーが起動しません。(トリガーについては「トリガーの作成」を参照されてください)。
実際に試してみます。次のようなテーブルを作成しました。データも2つ追加してあります。
create table user(id int, name varchar(10));
insert into user values(1, 'Yamada');
insert into user values(2, 'Suzuki');
トリガーの記録用のテーブルを作成しました。
create table log(log varchar(20), dt datetime);
user テーブルを対象に次のような DELETE トリガーを作成しました。
create trigger delete_trigger after delete on user for each row insert into log (log, dt) values('Delete', now());
-- --
では最初に DELETE 文でデータを削除した場合です。次のように DELETE 文を使ってデータをすべて削除します。
delete from user;
トリガーの記録用の log テーブルからデータを取得してみると、 user テーブルのデータを 1 つ削除するごとに DELETE トリガーが起動したことが確認できます。
select * from log;
-- --
次に TRUNCATE TABLE 文でデータを削除した場合です。 user テーブルにあらためて 2 つデータを追加しておきます。
insert into user values(1, 'Yamada');
insert into user values(2, 'Suzuki');
では TRUNCATE TABLE 文を使ってデータをすべて削除します。
truncate table user;
トリガーの記録用の log テーブルからデータを取得してみると、 log テーブルが delete from user を実行した時に記録されたデータから増えておらず TRUNCATE TABLE 文を実行しても DELETE トリガーが起動していないことが確認できます。
select * from log;
このように TRUNCATE TABLE 文を使ってテーブルのデータをすべて削除した場合には DELETE トリガーが起動しない点について注意してください。
-- --
TRUNCATE TABLE 文を使ってテーブルのデータをすべて削除する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。