サーチ…


構文

  • 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行が削除されました
スポットはペットから削除されます

p1p2はテーブル名のエイリアスです。特に長いテーブル名や読みやすさのために便利です。

人とペットの両方を削除するには:

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から削除し、 InnoDBON 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'


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow