サーチ…
前書き
DELETEステートメントは、テーブルからレコードを削除するために使用されます。
構文
- DELETE FROM TableName [WHERE 条件 ] [LIMIT カウント ]
特定の行をWHEREで削除する
これにより、 WHERE
条件に一致するすべての行が削除されます。
DELETE FROM Employees
WHERE FName = 'John'
すべての行を削除する
WHERE
句を省略すると、テーブルからすべての行が削除されます。
DELETE FROM Employees
TRUNCATEのパフォーマンスは、データを削除するだけのトリガーやインデックス、ログを無視するため、TRUNCATEのパフォーマンスが向上する仕組みの詳細については、 TRUNCATEのマニュアルを参照してください。
TRUNCATE句
これを使用して、テーブルを作成した状態にリセットします。これにより、すべての行が削除され、自動インクリメントなどの値がリセットされます。個々の行の削除もログに記録されません。
TRUNCATE TABLE Employees
他のテーブルとの比較に基づいて特定の行を削除する
他のテーブルの特定のデータと一致する(または一致しない)場合、テーブルからデータをDELETE
することは可能です。
いったんターゲットにロードされたソースからデータをDELETE
たいと仮定しましょう。
DELETE FROM Source
WHERE EXISTS ( SELECT 1 -- specific value in SELECT doesn't matter
FROM Target
Where Source.ID = Target.ID )
最も一般的なRDBMS実装(MySQL、Oracle、PostgresSQL、Teradataなど)では、 DELETE
時にテーブルを結合することができ、コンパクトな構文でより複雑な比較が可能です。
元のシナリオに複雑さを加えると、Aggregateは1日に1回Targetから構築され、同じIDを含まず同じ日付を含むとします。集計がその日に移入された後にのみ 、Sourceからデータを削除したいと仮定します。
MySQL、Oracle、Teradataでは、以下を使用してこれを実行できます。
DELETE FROM Source
WHERE Source.ID = TargetSchema.Target.ID
AND TargetSchema.Target.Date = AggregateSchema.Aggregate.Date
PostgreSQLでの使用:
DELETE FROM Source
USING TargetSchema.Target, AggregateSchema.Aggregate
WHERE Source.ID = TargetSchema.Target.ID
AND TargetSchema.Target.DataDate = AggregateSchema.Aggregate.AggDate
これは基本的にソース、ターゲット、集約の間のINNER JOINをもたらします。これらのIDのTargetに存在するTargetとDateに同じIDが存在する場合は、Sourceにも削除が実行されます。
次のように、同じクエリを書き込むこともできます(MySQL、Oracle、Teradata上)
DELETE Source
FROM Source, TargetSchema.Target, AggregateSchema.Aggregate
WHERE Source.ID = TargetSchema.Target.ID
AND TargetSchema.Target.DataDate = AggregateSchema.Aggregate.AggDate
明示的な結合は、一部のRDBMS実装(Oracle、MySQLなど)ではDelete
文で記述できますが、すべてのプラットフォームではサポートされていません(Teradataではサポートされていません)
比較は、不一致シナリオをすべての構文スタイルと一致させる代わりにチェックするように設計できます(以下に存在しNOT EXISTS
ことを観察してください)
DELETE FROM Source
WHERE NOT EXISTS ( SELECT 1 -- specific value in SELECT doesn't matter
FROM Target
Where Source.ID = Target.ID )