4.6.1 UPDATE文の指定形式および規則
行の値を更新します。
- 〈この項の構成〉
(1) 指定形式
- ■更新対象列名を指定して行を更新する場合
-
UPDATE文::=UPDATE 表名 〔〔AS〕 相関名〕 SET 更新対象列名=更新値〔,更新対象列名=更新値〕… 〔WHERE 探索条件〕 更新値::={値式|NULL|DEFAULT}
- ■ROW指定で行単位の更新をする場合
-
UPDATE文::=UPDATE 表名 〔〔AS〕 相関名〕 SET ROW=行更新値 〔WHERE 探索条件〕 行更新値::=?パラメタ
(2) 指定形式の説明
- ●表名
-
更新対象表の表名を指定します。表名の指定規則については,「6.1.5 名前の修飾」の「(2) 表名の指定形式」を参照してください。
指定規則を次に示します。
-
読み取り専用ビュー表は指定できません。
-
配列型の列を定義した表は指定できません。
-
- ●〔AS〕 相関名
-
更新対象表の相関名を指定します。相関名については,「6.1.5 名前の修飾」の「(4) 表指定の指定形式」を参照してください。相関名の有効範囲については,「6.8 範囲変数」を参照してください。
- ●更新対象列名=更新値〔,更新対象列名=更新値〕…
-
更新値::={値式|NULL|DEFAULT}
更新対象の列と,更新値(更新後の値)を指定します。
更新対象列名は,列指定の形式で指定できます。列指定の指定形式については,「6.1.5 名前の修飾」の「(5) 列指定の指定形式」を参照してください。
更新値には次のどれかを指定します。
- 値式:
-
更新後の値を値式の形式で指定します。値式については,「7.20 値式」を参照してください。
- NULL:
-
更新後の値をナル値にする場合に指定します。
- DEFAULT:
-
CREATE TABLE文のDEFAULT句で指定した列の既定値を,更新後の値とする場合に指定します。列の既定値については,「7.10 DEFAULT句」を参照してください。
DEFAULT句で列の既定値を指定していない場合は,列の既定値としてナル値が仮定されます。
- ●WHERE 探索条件
-
更新する行を選択する条件を指定します。WHERE句を省略すると,指定した表のすべての行が更新されます。
探索条件については,「7.18 探索条件」を参照してください。
指定規則を次に示します。
-
探索条件中に?パラメタを指定できます。
表名に更新可能ビュー表を指定した場合の留意事項を次に示します。
-
更新可能ビュー表の行を更新した場合,基表の行が更新されます。
-
ビュー表を定義した際に指定した探索条件と,ここで指定した探索条件の両方を満たす基表の行が更新されます。
-
WHERE句を省略した場合は,ビュー表を定義した際に指定した探索条件を満たす基表の行が更新されます。
-
- ●ROW=行更新値
-
行更新値::=?パラメタ
行単位でデータを更新する場合に指定します。ROWはFIX表に対してだけ指定できます。ROWを指定すると,行全体を1つのデータとして更新します。
?パラメタに仮定されるデータ型はCHAR型です。また,データ長は更新対象表の行長になります。また,構造体中に境界調整による空きがないようにしてください。行長の計算方法については,マニュアルHADB システム構築・運用ガイドの行の種別ごとの格納ページ数の求め方の計算式ROWSZを参照してください。
なお,?パラメタは1つだけ指定できます。
(3) 実行時に必要な権限
UPDATE文を実行する場合,次に示すすべての権限が必要になります。
-
CONNECT権限
-
行を更新する表に対するUPDATE権限
-
問合せ式本体に指定する表に対するSELECT権限
- (例)
-
UPDATE "T1" SET "C1"='P001' WHERE "T1"."C2" IN (SELECT "C2" FROM "T2" WHERE "C3"<=100)
上記のUPDATE文を実行する場合,表T1に対するUPDATE権限と,表T2に対するSELECT権限が必要になります。
(4) 規則
-
UPDATE文中に指定できる表,導出表,表関数導出表,および集まり導出表の延べ数は,最大2,048個になります。SQL文中に指定されている表,導出表,表関数導出表,および集まり導出表の数え方の規則と例については,「4.4.1 SELECT文の指定形式および規則」の「(4) 規則」を参照してください。
-
UPDATE文中に指定している集合演算がすべてUNIONの場合,指定できる集合演算の数は最大1,023個になります。ただし,指定した集合演算にEXCEPTまたはINTERSECTがある場合は,指定できる集合演算の数は最大63個になります。
-
UPDATE文中に指定できる外結合(FULL OUTER JOIN)の数は,最大63個になります。
-
探索条件中および更新値中の副問合せのFROM句には,更新対象表を指定できません。
-
更新値のデータ型は,更新対象列のデータ型と変換または代入できるデータ型にしてください。変換または代入できるデータ型については,「6.2.2 変換,代入,比較できるデータ型」を参照してください。
-
更新値に?パラメタを単独で指定する場合,仮定されるデータ型およびデータ長は更新対象列のデータ型およびデータ長になります。
-
DECIMAL型,NUMERIC型,DOUBLE PRECISION型,またはFLOAT型のデータで,次のデータ型の列を更新する場合,端数(小数)部分は切り捨てられます。
-
INTEGER
-
SMALLINT
また,DECIMAL型またはNUMERIC型のデータで,DECIMAL型またはNUMERIC型の列を更新する場合,列の位取りより下位の桁部分が切り捨てられます。
DOUBLE PRECISION型またはFLOAT型のデータで,DECIMAL型またはNUMERIC型の列を更新する場合,列の位取りより下位の桁部分が丸められます(最近接偶数への丸め)。
-
-
CHAR型,VARCHAR型,BINARY型,またはVARBINARY型の列を更新する際,更新値のデータ長が列の定義長より長い場合,表の更新ができません。
-
CHAR型の列を更新する際,更新値のデータ長が列の定義長より短い場合,データが左詰めに格納されて,余りの部分には半角空白が埋められます。
-
BINARY型の列を更新する際,更新値のデータ長が列の定義長より短い場合,データが左詰めに格納されて,余りの部分にはX'00'が埋められます。
-
INTEGER型,SMALLINT型,DECIMAL型,NUMERIC型,DOUBLE PRECISION型,またはFLOAT型の列を更新する際,更新値が各データ型の範囲外の場合,表の更新ができません。
-
SET句には更新対象列名を1,000個まで指定できます。
-
更新対象の行がない場合は,SQLCODEに100が設定されます。
-
更新対象列に同じ列名を重複して指定できません。
-
ROW指定をした場合,SET句を2つ以上指定できません。
-
ディクショナリ表またはシステム表の行は更新できません。
-
カラムストア表に対してUPDATE文を実行する場合,ローストア表とは異なる運用や設計が必要になります。詳細については,マニュアルHADB システム構築・運用ガイドのローストア表とカラムストア表の選択基準,シングルチャンク表の再編成が必要かどうかを確認する方法,およびマルチチャンク表の再編成が必要かどうかを確認する方法を参照してください。
-
アーカイブされている行は更新できません。アーカイブされている行を更新するUPDATE文はエラーになります。アーカイブされている行を更新したい場合は,更新したい行が格納されているチャンクのアーカイブ状態をいったん解除してください。そのあとに,UPDATE文を実行して行を更新してください。
-
アーカイブされていない行は,UPDATE文で更新できます。ただし,UPDATE文を実行する際,次の条件をすべて満たす必要があります。
-
探索条件に,アーカイブレンジ列を指定した条件を指定する
-
アーカイブレンジ列を指定した探索条件に,比較述語,IN述語,またはBETWEEN述語だけを指定する
-
アーカイブレンジ列を指定した探索条件に,OR条件やNOT条件などを指定しない
-
アーカイブされている行を更新対象にしていない
上記の条件をすべて満たさないと,UPDATE文がエラーになります。
- 重要
-
アーカイブレンジ列を指定した探索条件に指定できる述語に制限があります。また,OR条件やNOT条件以外にも,探索条件に指定するとUPDATE文がエラーになる条件があります。詳細については,マニュアルHADB AP開発ガイドのアーカイブレンジ列の日時情報を使用した検索範囲の絞り込みを参照してください。
UPDATE文が実行できる例とできない例の代表的な例を次に示します。なお,例中のARCHIVE-T1表はアーカイブマルチチャンク表とし,RECORD-DAY列はアーカイブレンジ列とします。
■UPDATE文が実行できる例
(例)
UPDATE "ARCHIVE-T1" SET "NUMBER"=100 WHERE "RECORD-DAY" BETWEEN DATE'2016/02/01' AND DATE'2016/02/29' AND "CODE"='P001'
上記の例の場合,次の条件をすべて満たしているため,UPDATE文を実行できます。
-
探索条件に,アーカイブレンジ列(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サーバは,アーカイブレンジ列を指定した探索条件によって判定しています。その際,アーカイブレンジ列に対する比較条件に定数を指定した場合,判定に掛かる時間を短くできます。一方,定数以外を指定した場合,判定に掛かる時間が非常に長くなるおそれがあります。
■UPDATE文が実行できない例
・探索条件にアーカイブレンジ列を指定していない
(例1)
UPDATE "ARCHIVE-T1" SET "NUMBER"=100
上記の例の場合,探索条件にアーカイブレンジ列(RECORD-DAY)を指定していないため,UPDATE文がエラーになります。
(例2)
UPDATE "ARCHIVE-T1" SET "NUMBER"=100 WHERE "CODE"='P001'
上記の例の場合,探索条件にアーカイブレンジ列(RECORD-DAY)を指定していないため,UPDATE文がエラーになります。アーカイブされていない行を更新する場合でもエラーになります。
・アーカイブレンジ列を指定した探索条件にOR条件やNOT条件などを指定している
(例)
UPDATE "ARCHIVE-T1" SET "NUMBER"=100 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条件が指定されているため,UPDATE文がエラーになります。上記のように,アーカイブされていない行を更新する場合でもエラーになります。
上記の例の場合,次のようにUPDATE文を2回に分けて実行すると,行を更新できます。
UPDATE "ARCHIVE-T1" SET "NUMBER"=100 WHERE "RECORD-DAY" BETWEEN DATE'2016-01-01' AND DATE'2016-01-31' UPDATE "ARCHIVE-T1" SET "NUMBER"=100 WHERE "RECORD-DAY" BETWEEN DATE'2016-03-01' AND DATE'2016-03-31'
・アーカイブされている行を更新対象にしている
(例)
UPDATE "ARCHIVE-T1" SET "NUMBER"=100 WHERE "RECORD-DAY" BETWEEN DATE'2015/11/01' AND DATE'2016/01/31'
上記の例の場合,アーカイブされている行を更新対象にしているため,UPDATE文がエラーになります。
・単独の列指定でアーカイブレンジ列を指定していない
(例)
UPDATE "ARCHIVE-T1" SET "NUMBER"=100 WHERE "RECORD-DAY" - 10 DAY > DATE'2016/02/01'
上記の例の場合,アーカイブレンジ列を使った日時演算を指定しているため,UPDATE文がエラーになります。
・アーカイブレンジ列の比較条件に日時演算を指定している
(例)
UPDATE "ARCHIVE-T1" SET "NUMBER"=100 WHERE "RECORD-DAY" >= CURRENT_DATE - 1 MONTH
上記の例の場合,アーカイブレンジ列の比較条件に日時演算を指定しているため,UPDATE文がエラーになります。
-
-
UPDATE文中にアーカイブマルチチャンク表を指定した場合,ロケーション表およびシステム表(STATUS_CHUNKS)に対するアクセスが発生します。その際,システム表(STATUS_CHUNKS)の排他資源が確保されます。排他制御の詳細については,マニュアルHADB システム構築・運用ガイドの排他制御を参照してください。
(5) 例題
- 例題1 更新対象列名を指定した行の更新
-
販売履歴表(SALESLIST)の次に示す条件を満たす行の販売個数(PUR-NUM)を6に更新します。
-
顧客ID(USERID):U00358
-
商品コード(PUR-CODE):P003
-
購入日(PUR-DATE):2011-09-08
UPDATE "SALESLIST" SET "PUR-NUM"=6 WHERE "USERID"='U00358' AND "PUR-CODE"='P003' AND "PUR-DATE"=DATE'2011-09-08'
-
- 例題2 更新対象列名を指定した行の更新(更新値に副問合せを指定した場合)
-
販売履歴表(SALESLIST)の商品コード(PUR-CODE)列がP003の商品カラー(PUR-COL)を,商品表(PRODUCTLIST)の商品コードがP003の商品と同じ商品カラーに変更します。
UPDATE "SALESLIST" SET "PUR-COL" = (SELECT "PUR-COL" FROM "PRODUCTLIST" WHERE "PUR-CODE"='P003') WHERE "PUR-CODE"='P003'
- 例題3 ROW指定による行の更新
-
販売履歴表(SALESLIST)の販売情報を更新します(ROW指定で行全体を更新します)。販売履歴表の列構成は,顧客ID(USERID),商品コード(PUR-CODE),販売個数(PUR-NUM),購入日(PUR-DATE)です。
UPDATE "SALESLIST" SET ROW=? WHERE "USERID"=?