DELETE文は、表から行を削除します。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合は表に対するDELETEが必要です。
SQL構文
DELETE [FIRST NumRows] FROM [Owner.]TableName[CorrelationName] [WHERE SearchCondition] [RETURNING|RETURN Expression[,...]INTO DataItem[,...]]
パラメータ
DELETE文には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
FIRST NumRows |
削除する行の数を指定します。FIRST NumRows は、副問合せの文ではサポートされていません。NumRows には、正のINTEGERか動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、? または:DynamicParameter です。動的パラメータの値は、文の実行時に設定されます。 |
[ Owner .] TableName [CorrelationName ] |
検索条件を満たす行を削除する表を指定します。
|
SearchCondition |
削除する行を指定します。検索条件に一致する行がない場合、表は変更されません。WHERE句を省略した場合は、すべての行が削除されます。検索条件には副問合せを含めることができます。 |
Expression |
有効な式の構文。第3章「式」を参照してください。 |
DataItem |
取得したExpression 値を格納するホスト変数またはPL/SQL変数。 |
説明
表の行をすべて削除した場合、表は空になりますが、DROP TABLE文を実行しないかぎり、表自体は削除されません。
外部キー制約に違反するDELETE処理はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。
DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。
子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。
RETURNING句の制限:
各Expression
は単純な式である必要があります。集計関数はサポートされません。
順序番号はOUTパラメータに戻せません。
ROWNUMおよび副問合せは、RETURNING句では使用できません。
RETURNING句のパラメータは、DELETE文のいずれの場所とも重複できません。
RETURNING句を使用して複数行を戻すには、PL/SQL BULK COLLECT機能が必要です。『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』を参照してください。
PL/SQLでは、RETURNING句はWHERE CURRENT処理と一緒には使用できません。
例
発注件数が50未満の行をすべて削除します。
DELETE FROM purchasing.orderitems WHERE quantity < 50;
id
が主キーでない場合、次の問合せはすべての重複する注文を削除します。
DELETE FROM orders a WHERE EXISTS (SELECT 1 FROM orders b WHERE a.id = b.id and a.rowid < b.rowid);
次の順序で文を指定すると、外部キー違反が発生します。
CREATE TABLE master (name CHAR(30), id CHAR(4) NOT NULL PRIMARY KEY); CREATE TABLE details (masterid CHAR(4),description VARCHAR(200), FOREIGN KEY (masterid) REFERENCES master(id)); INSERT INTO master('Elephant', '0001'); INSERT INTO details('0001', 'A VERY BIG ANIMAL'); DELETE FROM master WHERE id = '0001';
ビジーな表を削除しようとするとエラーが発生します。 この例では、t1
はビジーな表であり、親表とそれに基づく外部キー制約となっています。
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY (a)); CREATE TABLE t2 (c INT NOT NULL, FOREIGN KEY (c) REFERENCES t1(a)); INSERT INTO t1 VALUES (1,1); INSERT INTO t2 VALUES (1); DELETE FROM t1;
次のエラーが返されます。
SQL ERROR (3001): Foreign key violation [TTFOREIGN_0] a row in child table T2 has a parent in the delete range.
employees
から従業員を削除します。 empid
およびname
をemployee_id
およびlast_name
と同じデータ型の変数として宣言します。 行を削除し、employee_id
およびlast_name
を変数内に戻します。 正しい行が削除されたことを確認します。
Command> VARIABLE empid NUMBER(6) NOT NULL; Command> VARIABLE name VARCHAR2(25) INLINE NOT NULL; Command> DELETE FROM employees WHERE last_name='Ernst' > RETURNING employee_id, last_name INTO :empid,:name; 1 row deleted. Command> PRINT empid name; EMPID : 104 NAME : Ernst