サーチ…
構文
- DELETE [LOW_PRIORITY] [QUICK] [無視]テーブルから[WHERE条件] [ORDER BY式[ASC | DESC]] [LIMIT number_rows]; ///単一テーブルから行を削除する構文
パラメーター
パラメータ | 詳細 |
---|---|
LOW_PRIORITY | LOW_PRIORITY が指定されていると、テーブルから読み取ったプロセスがなくなるまで削除が遅れます |
IGNORE | IGNORE と、削除中に発生したすべてのエラーは無視されます |
表 | レコードを削除するテーブル |
WHERE条件 | レコードを削除するために満たす必要がある条件。条件が指定されていない場合は、テーブルのすべてのレコードが削除されます |
ORDER BY式 | ORDER BY が指定されている場合、レコードは指定された順序で削除されます |
限定 | テーブルから削除するレコードの最大数を制御します。与えられたnumber_rows が削除されます。 |
Where句で削除する
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
これは、その行のfield_one
の内容が 'value_one'と一致するテーブルからすべての行を削除します
WHERE
句はselectと同じように動作するので、 >
、 <
、 <>
やLIKE
などのものが使用できます。
注意:削除クエリには条件句(WHERE、LIKE)を使用する必要があります。条件節を使用しない場合、その表のすべてのデータが削除されます。
テーブルからすべての行を削除する
DELETE FROM table_name ;
これにより、テーブルのすべての行がすべて削除されます。構文の最も基本的な例です。また、 WHERE
句が省略されていると、テーブルを空にする可能性があるため、 DELETE
文を実際に使用する必要があります。
削除を制限する
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
これは 'Where with Where句を削除する'と同じ方法で動作しますが、制限された行数が削除されると削除を停止します。
このように削除する行を制限する場合は、条件に一致する最初の行が削除されることに注意してください。明示的に注文されていない場合、結果はソートされずに返される可能性があるため、期待通りのものではない可能性があります。
複数テーブルの削除
MySQLのDELETE
ステートメントは、 JOIN
構文を使用して、削除するテーブルを指定することもできます。これはネストされたクエリを避けるのに便利です。与えられたスキーマ:
create table people
( id int primary key,
name varchar(100) not null,
gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');
create table pets
( id int auto_increment primary key,
ownerId int not null,
name varchar(100) not null,
color varchar(100) not null
);
insert pets(ownerId,name,color) values
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
id | 名 | 性別 |
---|---|---|
1 | キャシー | f |
2 | ジョン | m |
3 | ポール | m |
4 | キム | f |
id | ownerId | 名 | 色 |
---|---|---|---|
1 | 1 | ローバー | ベージュ |
2 | 2 | 泡 | 紫の |
4 | 1 | ローバー2 | 白 |
ポールのペットを取り除きたい場合は、
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
次のように書き直すことができます。
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1行が削除されました
スポットはペットから削除されます
p1
とp2
はテーブル名のエイリアスです。特に長いテーブル名や読みやすさのために便利です。
人とペットの両方を削除するには:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2行が削除されました
スポットはペットから削除されます
PaulがPeopleから削除されました
外部キー
DELETE文がforeingキー制約付きの表を含むとき、オプティマイザは関係に従わない順序で表を処理することがあります。たとえば、 pets
の定義に外部キーを追加する
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
エンジンがpets
前にpeople
からエントリを削除しようとすると、次のエラーが発生する可能性があります。
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))
この場合の解決策は、行をpeople
から削除し、 InnoDB
のON DELETE
機能を使用して削除を伝播することです。
DELETE FROM people
WHERE name = 'Paul';
2行が削除されました
PaulがPeopleから削除されました
スポットはペットのカスケードで削除されます
別の解決策は、foreingキーのチェックを一時的に無効にすることです。
SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;
基本的な削除
DELETE FROM `myTable` WHERE `someColumn` = 'something'
WHERE
句はオプションですが、それがなければすべての行が削除されます。
DELETEとTRUNCATE
TRUNCATE tableName;
これにより、すべてのデータが削除され、 AUTO_INCREMENT
インデックスがリセットされます。巨大なデータセットのDELETE FROM tableName
からDELETE FROM tableName
よりもはるかに高速です。これは、開発/テスト中に非常に役立ちます。
テーブルを切り捨てると 、SQL Serverはデータを削除しませんが、テーブルを削除して再作成するため、ページの割り当てが解除され、上書きされたページの前に切り捨てられたデータを復元できます。 (このスペースは、 innodb_file_per_table=OFF
ためにただちに取り戻すことはできません)。
マルチテーブルDELETE
MySQLは、一致する行をどのテーブルから削除する必要があるかを指定できます
-- remove only the employees
DELETE e
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove employees and department
DELETE e, d
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove from all tables (in this case same as previous)
DELETE
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'