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 | 佐藤 太郎 | さとう たろう | 22 | 男 | 2020/04/01 | 営業部 | |
2 | 田中 花子 | たなか はなこ | 30 | 女 | 2020/12/31 | 製造部 | |
3 | 鈴木 次郎 | すずき じろう | 45 | 男 | 2000/05/25 | 総務部 | |
4 | 西田 梅子 | にしだ うめこ | 23 | 女 | 2019/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;