4.1.1 DELETE文の指定形式および規則
指定した探索条件を満たす行を削除します。
- 〈この項の構成〉
(1) 指定形式
DELETE文::=DELETE FROM 表名 〔〔AS〕 相関名〕 〔WHERE 探索条件〕
(2) 指定形式の説明
- ●表名
-
削除したい行がある表(削除対象表)の表名を指定します。表名の指定規則については,「6.1.5 名前の修飾」の「(2) 表名の指定形式」を参照してください。
指定規則を次に示します。
-
読み取り専用ビュー表は指定できません。
-
配列型の列を定義した表は指定できません。
-
- ●〔AS〕 相関名
-
削除対象表の相関名を指定します。相関名については,「6.1.5 名前の修飾」の「(4) 表指定の指定形式」を参照してください。相関名の有効範囲については,「6.8 範囲変数」を参照してください。
- ●WHERE 探索条件
-
削除対象とする行の条件を探索条件に指定します。探索条件については,「7.19 探索条件」を参照してください。
WHERE 探索条件を省略すると,指定した表のすべての行が削除されます。
指定規則を次に示します。
-
探索条件中に?パラメタを指定できます。
表名に更新可能ビュー表を指定した場合の留意事項を次に示します。
-
更新可能ビュー表の行を削除した場合,基表の行が削除されます。
-
ビュー表を定義した際に指定した探索条件と,ここで指定した探索条件の両方を満たす行が,基表から削除されます。
-
WHERE 探索条件を省略した場合は,ビュー表を定義した際に指定した探索条件を満たす行が,基表から削除されます。
-
(3) 実行時に必要な権限
DELETE文を実行する場合,次に示すすべての権限が必要になります。
-
CONNECT権限
-
行を削除する表に対するDELETE権限
-
問合せ式本体に指定する表に対するSELECT権限
- (例)
-
DELETE FROM "T1" WHERE "T1"."C1" IN (SELECT "C1" FROM "T2" WHERE "C3"<=100)
上記のDELETE文を実行する場合,表T1に対するDELETE権限と,表T2に対するSELECT権限が必要になります。
(4) 規則
-
削除の対象になる行がない場合は,SQLCODEに100が設定されます。
-
DELETE文中に指定できる表,導出表,表関数導出表,および集まり導出表の延べ数は,最大2,048個になります。SQL文中に指定されている表,導出表,表関数導出表,および集まり導出表の数え方の規則と例については,「4.4.1 SELECT文の指定形式および規則」の「(4) 規則」を参照してください。
-
DELETE文中に指定している集合演算がすべてUNIONの場合,指定できる集合演算の数は最大1,023個になります。ただし,指定した集合演算にEXCEPTまたはINTERSECTがある場合は,指定できる集合演算の数は最大63個になります。
-
DELETE文中に指定できる外結合(FULL OUTER JOIN)の数は,最大63個になります。
-
ディクショナリ表またはシステム表の行は削除できません。
-
探索条件中の副問合せのFROM句には,行の削除対象となる表を指定できません。
-
カラムストア表に対してDELETE文を実行する場合,ローストア表とは異なる運用や設計が必要になります。詳細については,マニュアルHADB システム構築・運用ガイドのローストア表とカラムストア表の選択基準,シングルチャンク表の再編成が必要かどうかを確認する方法,およびマルチチャンク表の再編成が必要かどうかを確認する方法を参照してください。
-
アーカイブされている行は削除できません。アーカイブされている行を削除するDELETE文はエラーになります。アーカイブされている行を削除したい場合は,削除したい行が格納されているチャンクのアーカイブ状態をいったん解除してください。そのあとに,DELETE文を実行して行を削除してください。
-
アーカイブされていない行は,DELETE文で削除できます。ただし,DELETE文を実行する際,次の条件をすべて満たす必要があります。
-
探索条件に,アーカイブレンジ列を指定した条件を指定する
-
アーカイブレンジ列を指定した探索条件に,比較述語,IN述語,またはBETWEEN述語だけを指定する
-
アーカイブレンジ列を指定した探索条件に,OR条件やNOT条件などを指定しない
-
アーカイブされている行を削除対象にしていない
上記の条件をすべて満たさないと,DELETE文がエラーになります。
- 重要
-
アーカイブレンジ列を指定した探索条件に指定できる述語に制限があります。また,OR条件やNOT条件以外にも,探索条件に指定するとDELETE文がエラーになる条件があります。詳細については,マニュアルHADB AP開発ガイドのアーカイブレンジ列の日時情報を使用した検索範囲の絞り込みを参照してください。
DELETE文が実行できる例とできない例の代表的な例を次に示します。なお,例中のARCHIVE-T1表はアーカイブマルチチャンク表とし,RECORD-DAY列はアーカイブレンジ列とします。
■DELETE文が実行できる例
(例)
DELETE FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016/02/01' AND DATE'2016/02/29' AND "CODE"='P001'
上記の例の場合,次の条件をすべて満たしているため,DELETE文を実行できます。
-
探索条件に,アーカイブレンジ列(RECORD-DAY)を指定している
-
アーカイブレンジ列を指定した探索条件に,BETWEEN述語だけが指定されている
-
アーカイブレンジ列を指定した探索条件に,OR条件やNOT条件などを指定していない
-
アーカイブされている行を削除対象にしていない
- 重要
-
探索条件に指定するアーカイブレンジ列に対する比較条件は,定数を指定することを推奨します。
- (例)推奨する指定例
-
"RECORD-DAY" BETWEEN DATE'2016/01/01' AND DATE'2016/01/10'
"RECORD-DAY" >= DATE'2016/02/10'
定数以外の指定は推奨しません。
- (例)推奨しない指定例
-
"RECORD-DAY" BETWEEN ? AND ?
"RECORD-DAY" >= CURRENT_DATE
- メモ
-
削除対象のデータがアーカイブされているかどうかを,HADBサーバは,アーカイブレンジ列を指定した探索条件によって判定しています。その際,アーカイブレンジ列に対する比較条件に定数を指定した場合,判定に掛かる時間を短くできます。一方,定数以外を指定した場合,判定に掛かる時間が非常に長くなるおそれがあります。
■DELETE文が実行できない例
・探索条件にアーカイブレンジ列を指定していない
(例1)
DELETE FROM "ARCHIVE-T1"
上記の例の場合,探索条件にアーカイブレンジ列(RECORD-DAY)を指定していないため,DELETE文がエラーになります。
(例2)
DELETE FROM "ARCHIVE-T1" WHERE "CODE"='P001'
上記の例の場合,探索条件にアーカイブレンジ列(RECORD-DAY)を指定していないため,DELETE文がエラーになります。アーカイブされていない行を削除する場合でもエラーになります。
・アーカイブレンジ列を指定した探索条件にOR条件やNOT条件などを指定している
(例)
DELETE FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016-01-01' AND DATE'2016-01-31' OR "RECORD-DAY" BETWEEN DATE'2016-03-01' AND DATE'2016-03-31'
上記の例の場合,アーカイブレンジ列を指定した探索条件にOR条件が指定されているため,DELETE文がエラーになります。上記のように,アーカイブされていない行を削除する場合でもエラーになります。
上記の例の場合,次のようにDELETE文を2回に分けて実行すると,行を削除できます。
DELETE FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016-01-01' AND DATE'2016-01-31' DELETE FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016-03-01' AND DATE'2016-03-31'
・アーカイブされている行を削除対象にしている
(例)
DELETE FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2015/11/01' AND DATE'2016/01/31'
上記の例の場合,アーカイブされている行を削除対象にしているため,DELETE文がエラーになります。
・単独の列指定でアーカイブレンジ列を指定していない
(例)
DELETE FROM "ARCHIVE-T1" WHERE "RECORD-DAY" - 10 DAY > DATE'2016/02/01'
上記の例の場合,アーカイブレンジ列を使った日時演算を指定しているため,DELETE文がエラーになります。
・アーカイブレンジ列の比較条件に日時演算を指定している
(例)
DELETE FROM "ARCHIVE-T1" WHERE "RECORD-DAY" >= CURRENT_DATE - 1 MONTH
上記の例の場合,アーカイブレンジ列の比較条件に日時演算を指定しているため,DELETE文がエラーになります。
-
-
DELETE文中にアーカイブマルチチャンク表を指定した場合,ロケーション表およびシステム表(STATUS_CHUNKS)に対するアクセスが発生します。その際,システム表(STATUS_CHUNKS)の排他資源が確保されます。排他制御の詳細については,マニュアルHADB システム構築・運用ガイドの排他制御を参照してください。
(5) 例題
- 例題1
-
顧客表(USERSLIST)から,顧客ID(USERID)がU00212の行を削除します。
DELETE FROM "USERSLIST" WHERE "USERID"='U00212'
- 例題2
-
販売履歴表(SALESLIST)から,購入日(PUR-DATE)が2011/9/4〜2011/9/5の行を削除します。
DELETE FROM "SALESLIST" WHERE "PUR-DATE" BETWEEN DATE'2011-09-04' AND DATE'2011-09-05'