DELETE
DELETE文は、表から行を削除します。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合は表に対するDELETEが必要です。
TimesTen Scaleoutでの使用
この文は、TimesTen Scaleoutでサポートされています。
SQL構文
DELETE [hint] [FIRST NumRows] FROM [Owner.]TableName [CorrelationName] [WHERE SearchCondition] [RETURNING|RETURN Expression[,...]INTO DataItem[,...]]
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
|
|
|
削除する行の数を指定します。 |
|
|
検索条件を満たす行を削除する表を指定します。
|
|
|
削除する行を指定します。検索条件に一致する行がない場合、表は変更されません。 |
|
|
有効な式の構文。詳細は、「式」を参照してください。 |
|
|
取得した |
説明
-
表の行をすべて削除した場合、表は空になりますが、
DROP TABLE文を実行しないかぎり、表自体は削除されません。 -
表にアウトライン列があり、削除する数百万の行がある場合、
ttCompact組込みプロシージャを呼び出してメモリーを解放することを検討してください。 -
外部キー制約に違反する
DELETE処理はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。 -
DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。 -
子表の外部キー制約で
ON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。 -
RETURNING句の制限:-
各
Expressionは単純な式である必要があります。集計関数はサポートされません。 -
順序番号は
OUTパラメータに戻せません。 -
ROWNUMおよび副問合せは、RETURNING句では使用できません。 -
RETURNING句のパラメータは、DELETE文のいずれの場所とも重複できません。 -
RETURNING句を使用して複数行を戻すには、PL/SQLBULK COLLECT機能が必要です。BULK COLLECTの詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』の「FORALL操作およびBULK COLLECT操作」を参照してください。 -
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