テーブルの行を削除します。
Synopsis
DELETE restriction FROM table-name
WHERE conditional-expression
DELETE restriction FROM table-name
WHERE CURRENT OF cursor
AND conditional-expression
DELETE コマンドは、指定条件に適合する行をテーブルから削除します。テーブルからの行の削除は、直接、またはビュー経由が可能です。ビュー経由で削除する場合は、
CREATE VIEW で説明されているように、必要条件や制限事項に従います。
DELETE は、全か無かのイベントです。指定されたすべての行が削除されるか、削除が行われないかのいずれかです。Caché は、SQLCODE ステータス変数を返し、
DELETE の成功もしくは失敗を示します。テーブルから行を削除するには、以下の条件を満たしている必要があります。
-
テーブルに対する DELETE 特権が必要です。この特権を持っていないと SQLCODE -99 (特権違反) エラーになります。詳細は、"
GRANT" コマンドを参照してください。
-
テーブルを READONLY として定義することはできません。読み取り専用テーブルを参照する
DELETE をコンパイルすると、SQLCODE -115 エラーが発生します。このエラーは実行時にのみ発生するのではなく、コンパイル時にも発生するようになったことに注意してください。"
Caché オブジェクトの使用法" の "
オブジェクトの永続性" の章で READONLY オブジェクトの説明を参照してください。
-
ビュー経由で削除する場合、ビューを WITH READ ONLY として定義することはできません。これを実行しようとすると、SQLCODE -35 エラーが返されます。詳細は、"
CREATE VIEW" コマンドを参照してください。
-
削除する行が存在している必要があります。存在しない行を削除しようとすると、SQLCODE -106 エラーが発生します。
-
削除対象に指定されたすべての行が削除可能である必要があります。複数行の
DELETE はアトミック処理です。1 行以上の行が削除不可能である場合、
DELETE 操作は失敗し、行は削除されません。例えば、指定された行の 1 行の削除が外部キーの参照整合性に違反する場合、
DELETE はすべての行の削除に失敗します。
-
%NOCHECK
DELETE 時に外部キー参照整合性チェックを抑制します。
-
%NOLOCK
DELETE 時に行をロックしません。単独のユーザ/処理がデータベースを更新する際にのみ使用します。
-
%NOINDEX インデックス・マップは
DELETE 処理中には削除されません。
-
%NOTRIGGER
DELETE 処理中にベース・テーブル・トリガが実行されません。
%NOCHECK を指定しない場合、Caché ではシステム構成設定を使用して外部キーの参照整合性チェックを実行するかどうかが決まります。システムの既定値は以下のように設定できます。
-
ObjectScript $SYSTEM.SQL.SetFilerRefIntegrity() 関数を呼び出します。
-
DELETE 操作時には、すべての外部キー参照について、参照されるテーブルの該当する行に対する共有ロックが取得されます。この行は、トランザクションの終了までロックされています。これにより、参照される行は、
DELETE のロールバックがあってもそれより前に変更されることがなくなります。
%NOLOCK を指定しない場合、Caché は、
INSERT、
UPDATE、および
DELETE 操作時に標準のロックを実行します。一意フィールドの値は、現行のトランザクションの間、ロックされます。
既定のロックしきい値は、テーブルごとに 1000 ロックです。つまり、トランザクション時にテーブルから 1000 を超える一意フィールド値を削除する場合は、ロックしきい値に到達し、Caché はロック・レベルを自動的に一意フィールド値ロックからテーブル・ロックへと上げます。これによってトランザクション時に、ロック・テーブルをオーバーフローすることなく、大規模な削除を実行できます。このロックしきい値は設定可能です。トランザクションでのロックの詳細は、このドキュメントの "SQL の概念" の "
トランザクション" を参照してください。
以下の例は、TempEmployees テーブルからすべての行を削除します。
DELETE FROM TempEmployees
以下の例は、Employees テーブルから、従業員番号 234 番を削除します。
DELETE
FROM Employees
WHERE EmpId = 234
以下の例は、CurStatus 列が "Retired" に設定されているすべての行を、ActiveEmployees テーブルから削除します。
DELETE FROM ActiveEmployees
WHERE CurStatus = 'Retired'