はじめに
ポートフォリオ作成中に、DBの中身を確認したり弄ったりすることが多いのですが、データを削除するコマンドを調べると"truncate table ~"が出てきました。
MySQLのコマンドに対しての知識が皆無だった時の自分がこのコマンドを見たときは、「イメージだとdeleteって単語を使いそうだけど違うのか」となんとなく疑問に思いながら、"truncate"を使っていました。
デリケートなDBを扱うコマンドをなんとなくで使ってるのも恐ろしいなと思ったので、調べたことを備忘録として残そうと思います。
DELETEとは
DELETE は、テーブルの行を削除する DML ステートメントです。
公式ドキュメントより引用
上記の文章の通り、deleteはテーブル内のデータの行を指定して削除することが可能なようです。
そして、もちろん選択範囲をテーブル内全てにすることで削除することが可能です。
#全レコードを削除
DELETE FROM "テーブル名";
#usersテーブル内の全レコードを削除
DELETE FROM "users";
#色々なコマンド(whereやupdateなど)を使って条件を絞って削除することができる
DELETE FROM "テーブル名" WHERE "主キー項目(PK)" = "値" ;
#usersテーブルのidが10の行を削除
DELETE FROM "users" WHERE "id" = "10" ;
※主キーについての説明はこちら
またDELETE文はコミット前であればロールバックが可能です。
TRUNCATE TABLEとは
TRUNCATE TABLEは条件指定など行わず、テーブル内のデータを全て削除します。
確実にテーブル内を全削除するので、"TRUNCATE"ではなく、"TRUNCATE TABLE"までで1セットみたいですね。
(公式ドキュメントの見出しもTRUNCATE TABLE 構文って書いてあったので)
ただ削除するだけなら、全部DELETE使えばいいじゃんってなるかもしれませんが、もちろん理由がありました。
それは、"DELETE"よりも"TRUNCATE TABLE"の方が早く削除ができることです。
なので全データを削除する際には"TRUNCATE TABLE"が推奨されているようです。
切り捨て操作はテーブルを削除して再作成するため、特に大きなテーブルの場合は、行を 1 つずつ削除するよりはるかに高速です。
※公式ドキュメントより引用
注意点は、ロールバックが行えないことです。
切り捨て操作は暗黙的なコミットを発生させるため、ロールバックできません。
※公式ドキュメントより引用
#テーブル内のデータを削除
TRUNCATE TABLE テーブル名;
#usersテーブル内のデータを削除
TRUNCATE TABLE users;
僕が全データを削除するコマンドを探していたので最初に"DELETE"ではなく、"TRUNCATE TABELE"の記事がヒットしたんですね!
終わりに
本番環境で間違えてコマンドを叩いてデータを削除したらと考えるだけで恐ろしいですね。
今は使う場面が限られていたので"TRUNCATE TABLE"のみを叩けば問題なかったのですが、
将来のことを考えるとしっかりコマンドを全体的に理解するべきだと感じました。
参考