サーチ…


前書き

DELETEステートメントは、テーブルからレコードを削除するために使用されます。

構文

  1. 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 )


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