SQL-DML テーブルの行を削除する(DELETE、TRUNCATE TABLE)

SQLのサンプルは以下のテーブルを使用して解説

表内の行を削除する場合に使用するDELETE命令の使用方法とSQLサンプルのメモをしておこうと思う。

使用するサンプルテーブル

SQLのサンプルは以下のテーブルを使用して解説

1、テーブル名:Employee(社員テーブル)

 社員の情報を管理するテーブル

属性名
カラム名
社員ID
member_id
社員名
member_name
社員名かな
member_namekana
年齢
member_age
性別
member_gender
入社日
join_company
所属部門
dept
1佐藤 太郎さとう たろう222020/04/01営業部
2田中 花子たなか はなこ302020/12/31製造部
3鈴木 次郎すずき じろう452000/05/25総務部
4西田 梅子にしだ うめこ232019/09/01販売部
テーブル定義

テーブルの特定の条件に合致した行を削除する場合

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • Access

テーブル内で条件をして合致する行(レコード)を削除する。

ただし、システム運用時にDELETE文で数十万レコード以上のデータを削除する際は、大量のトランザクションログが作成されデータベースに負荷をかけるため、実行前に検証を行う必要がある。

また、トランザクションログはバックアップを取得するまでデータベースサーバーのストレージを圧迫するため、こちらも検証が注意が必要である。

【基本構文】

DELETE FROM 表名(テーブル名) WHERE 列 = 値;

【サンプルSQL】

member_id(社員ID)が1のレコードを削除する。

DELETE FROM Employee WHERE member_id = 1;
結果

テーブルの全行を削除する場合①

WHERE句を指定しない場合は、テーブル内のレコードをすべて削除する。ただし、数十万以上の行(レコード)が存在するテーブルでは、あまりお勧めできない。DELETE文の処理は重いため、「TRUNCATE TABLE」を使用したほうが処理は早い。

DELETE文は、一度に1行ずつ削除して削除した行をトランザクションログに記録します。

削除中は、テーブル内の行はロックされる。

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle
  • Access

【基本構文】

DELETE FROM 表名(テーブル名);

【サンプルSQL】

DELETE FROM Employee;
結果

テーブルの全行を削除する場合②(TRUNCATE TABLE編)

【対応データベース】

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle

TRUNCATE TABLEを使用するとテーブル内のレコードを高速に全削除することができる。

ただし、トランザクションログには記録されないためログからリカバリはできないので、使用する際は気を付ける必要がある。

挙動としては、drop tableしてcreate tableする意味に近い

個々の行の削除はログに記録しない。

【MySQL】

テーブルの列にAUTO_INCREMENT が設定されている場合、リセットされ1から始まる。

【基本構文】

TRUNCATE TABLE 表名(テーブル名);

【サンプルSQL】

TRUNCATE TABLE Employee;
結果