UPDATE ステートメント
UPDATE ステートメントは、表、ビュー、またはニックネームの行で、 あるいは指定された全選択の基礎になる表、ニックネーム、またはビューの行で、 指定された列の値を更新します。
ビューに対する更新操作用に INSTEAD OF トリガーが定義されていない場合、 ビューの行を更新することは、そのビューの基本表の行を更新することでもあります。 このようなトリガーが定義されている場合は、トリガーが代わりに実行されます。 ニックネームを使用して行を更新することは、 そのニックネームが参照するデータ・ソース・オブジェクト中の行を更新することでもあります。
- 検索条件付き UPDATE 形式は、 1 つまたは複数の行 (任意指定の検索条件によって決まる) を更新する場合に使用されます。
- 位置指定 UPDATE 形式は、 1 行 (カーソルの現在位置によって決まる) だけを更新する場合に使用されます。
呼び出し
UPDATE ステートメントはアプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。
許可
- ターゲット表、ビュー、またはニックネームに対する UPDATE 特権
- 更新するそれぞれの列 (period-clause が指定されている場合には、BUSINESS_TIME 期間の列を含む) に対する UPDATE 特権
- ターゲットとなる表、ビュー、またはニックネームのスキーマに対する UPDATEIN 特権
- ターゲット表、ビュー、またはニックネームに対する CONTROL 特権
- ターゲットとなる表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS
- DATAACCESS 権限
- SELECT 特権
- 参照される表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- CONTROL 特権
- 参照される表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS
- DATAACCESS 権限
- SELECT 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- CONTROL 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS
- DATAACCESS 権限
- SELECT 特権
- CONTROL 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する SELECTIN 特権
- 表、ビュー、またはニックネームが含まれるスキーマに対する DATAACCESS
- DATAACCESS 権限
指定した表またはビューの前に ONLY キーワードがある場合、ステートメントの許可 ID が持つ特権に次のいずれかが含まれていることも必要です。つまり、指定した表またはビューの副表またはサブビューごとの SELECT 特権、または指定した表またはビューの副表またはサブビューが含まれるスキーマに対する SELECTIN 特権のいずれかです。
静的 UPDATE ステートメントの場合、GROUP 特権はチェックされません。
更新操作の対象がニックネームの場合は、データ・ソースでステートメントが実行されないうちは、 そのデータ・ソース上のオブジェクトに対する特権は考慮されません。 この時点で、データ・ソースに接続するために使用される許可 ID は、データ・ソースのオブジェクトに対して操作を行うのに必要な特権を持っている必要があります。 ステートメントの許可 ID は、データ・ソースの別の許可 ID へマップできます。
構文 (検索条件付き更新)
- 1 If the period-clause is specified, neither the offset-clause nor the fetch-clause can be specified (SQLSTATE 42601).
- 2 The specified table-reference cannot be an analyze_table-expression (that is, the result of a data mining model) or a data-change-table-reference (that is, the result of a nested UPDATE, DELETE, or INSERT statement) (SQLSTATE 42601).
- 3 If the order-by-clause is specified, either the offset-clause or fetch-clause must also be specified (SQLSTATE 42601).
構文 (位置指定更新)
- 1 The number of expressions, NULLs and DEFAULTs must match the number of column names.
- 2 The number of columns in the select list must match the number of column names.
説明
- table-name、view-name、
nickname、または (fullselect)
- 更新操作の対象のオブジェクトを指定します。 名前は、以下のいずれかのオブジェクトを示すものでなければなりません。
- 現行サーバーでカタログ内に記述されている表、ビュー、またはニックネーム
- remote-object-name を使用して指定されたリモート・サーバーにある表またはビュー
table-name が型付き表である場合は、 このステートメントを使用して、その表またはそれに関係する副表の行を更新できます。 WHERE 節で設定または参照できるのは、指定した表の列だけです。 位置指定 UPDATE の場合は、FROM 節に指定されているのと同じ表、ビュー、またはニックネームを、 関連するカーソルにも ONLY を使用せずに指定しなければなりません。
更新操作のオブジェクトが全選択の場合、CREATE VIEW ステートメントの説明の
「更新可能ビュー」
Notes 項目で定義されているように、全選択は更新可能でなければなりません。更新操作のオブジェクトがニックネームである場合は、DEFAULT および UNASSIGNED の拡張標識変数の値は使用できません (SQLSTATE 22539)。
テンポラル表、および更新操作のターゲットとしてのビューまたは 全選択 の使用に関連した追加の制約事項については、このトピックの「注」セクションの
システム期間テンポラル表に関する考慮事項
およびアプリケーション期間テンポラル表に関する考慮事項
を参照してください。 - ONLY (テーブル名)
- 型付き表の場合に適用できます。 ONLY キーワードは、指定した表のデータだけにステートメントを適用し、 その表に関係する副表の行は更新できないことを指定します。 位置指定 UPDATE の場合は、FROM 節に指定されているのと同じ表を、 関連するカーソルにも ONLY キーワードを使用して指定しなければなりません。 table-name が型付き表でない場合は、 このステートメントに ONLY キーワードを使用しても効果はありません。
- ONLY (ビュー名)
- 型付きビューの場合に適用できます。 ONLY キーワードは、指定されたビューのデータだけにステートメントを適用し、 その表に関係するサブビューの行は更新できないことを指定します。 位置指定 UPDATE の場合は、FROM 節に指定されているのと同じビューを、 関連するカーソルにも ONLY を指定して指定しなければなりません。 view-name が型付きビューでない場合は、 このステートメントに ONLY キーワードを使用しても効果はありません。
- period-clause
- 期間節が更新操作のターゲットに適用されることを指定します。 更新操作のターゲットがビューである場合、
以下の条件がビューに適用されます。
- ビュー定義の外部全選択の FROM 節には、 アプリケーション期間テンポラル表への直接または間接的な参照を含める必要があります (SQLSTATE 42724M)。
- ビューに関して INSTEAD OF UPDATE トリガーが定義されていてはなりません (SQLSTATE 428HY)。
- FOR PORTION OF BUSINESS_TIME
- これを指定すると、行の中の期間節で指定した期間の一部分についてのみ、行値に更新が適用されます。 表には期間 BUSINESS_TIME が存在していなければなりません (SQLSTATE 4274M)。
- FROM value1 TO value2
- これを指定すると、value1 から value2 までで指定した期間について、行に更新が適用されます。 value1 が value2 以上である場合、または value1 または value2 が NULL 値である場合には、行は更新されません (SQLSTATE 02000)。FROM value1 TO value2 で指定した期間では、更新のターゲットの行に含まれる期間 BUSINESS_TIME は、以下のいずれかの状態になります。
- 開始列の値が value1 より小さく、終了列の値が value1より大きい場合は、指定された期間の 先頭とオーバーラップします 。
- 終了列の値が value2 以上であり、かつ開始列の値が value2より小さい場合は、指定された期間の 終了をオーバーラップします 。
- BUSINESS_TIME の開始列の値が value1 以上であり、対応する終了列の値が value2以下である場合、指定された期間内に 完全に含まれる が存在します。
- 指定期間の開始または指定期間の終了のいずれか一方にのみ行がオーバーラップする場合には、指定期間に一部が含まれます。
- この行に含まれる期間が指定期間の開始および終了とオーバーラップする場合には、指定期間と完全にオーバーラップします。
- BUSINESS_TIME の両方の列が value1 以下の場合、または value2以上の場合、期間内は 含まれない です。
行に含まれる期間 BUSINESS_TIME が指定期間に含まれない場合には、行は更新されません。 それ以外の場合は、期間 BUSINESS_TIME の列の値がどのように指定期間とオーバーラップするかに基づいて、以下のように更新が適用されます。- 行に含まれる期間 BUSINESS_TIME が指定期間内に完全に含まれる場合には、その行は更新され、BUSINESS_TIME の開始列と終了列の値は変更されません。
- 行に含まれる期間 BUSINESS_TIME の一部が指定期間に含まれ、指定期間の開始とオーバーラップする場合には、次のように処理されます。
- 行が更新されます。 更新された行の開始列の値は value1 に、終了列の値は終了列の元の値にそれぞれ設定されます。
- その行の元の値を使用して行が挿入されます。ただし終了列は value1 に設定されます。
- 行に含まれる期間 BUSINESS_TIME の一部が指定期間に含まれ、指定期間の終了とオーバーラップする場合には、次のように処理されます。
- 行が更新されます。 更新された行の開始列の値は開始列の元の値に、終了列は value2 にそれぞれ設定されます。
- その行の元の値を使用して行が挿入されます。ただし開始列は value2 に設定されます。
- 行に含まれる期間 BUSINESS_TIME が指定期間と完全にオーバーラップする場合には、次のように処理されます。
- 行が更新されます。 更新された行の開始列の値は value1 に、終了列の値は value2 にそれぞれ設定されます。
- その行の元の値を使用して行が挿入されます。ただし終了列は value1 に設定されます。
- その行の元の値を使用して追加行が挿入されます。ただし開始列は value2 に設定されます。
- value1 および value2
- 各式は、日付データ・タイプ、タイム・スタンプ・データ・タイプ、あるいは日付またはタイム・スタンプのストリング表記として有効なデータ・タイプの値を戻す必要があります (SQLSTATE 428HY)。 各式の結果は、指定期間の列のデータ・タイプと比較可能でなければなりません (SQLSTATE 42884)。 『
代入と比較
』で説明されている比較規則を参照してください。それぞれの式には、以下のサポートされているオペランドのいずれかを組み込むことができます (SQLSTATE 428HY)。- 定数
- 特殊レジスター
- 変数。 詳しくは、 変数の参照を参照してください。
- スカラー関数。ただし引数が、サポートされているオペランドである場合 (ただしユーザー定義関数および非 deterministic 関数は使用できません)
- CAST 指定。ただしキャスト・オペランドが、サポートされているオペランドである場合
- 算術演算子および算術オペランドを使用する式
- correlation-clause
- search-condition や assignment-clause で、
表、ビュー、ニックネーム、または全選択の指定に使用できます。 correlation-clause の説明については、
『副選択』
の説明のtable-reference
を参照してください。 include-columns - 全選択の FROM 節にネストされているとき、
table-name や view-name などの列と一緒に UPDATE ステートメントの中間結果表に組み込まれている列セットを指定します。 include-columns は、
table-name や view-name で指定されている列のリストの最後に付加されます。
- INCLUDE
- UPDATE ステートメントの中間結果表に組み込まれる列のリストを指定します。 column-name
- UPDATE ステートメントの中間結果表の列を指定します。 名前は、他の組み込み列や、 table-name または view-name の列と同じ名前であってはなりません (SQLSTATE 42711)。 data-type
- 組み込み列のデータ・タイプを指定します。 データ・タイプは、CREATE TABLE ステートメントでサポートされているものでなければなりません。
- SET
- この後に、列名への値の割り当てを指定します。 割り当て文節
- column-name
- 更新する列を指定します。 拡張標識変数が使用可能でない場合は、column-name は、指定された表、ビュー、またはニックネームの更新可能列か、INCLUDE 列を識別しなければなりません。 型付き表のオブジェクト ID 列は更新できません (SQLSTATE 428DZ)。 ..attribute-name を付けて指定しない限り、
1 つの列を複数回指定することはできません (SQLSTATE 42701)。
INCLUDE 列を指定した場合、列名は修飾できません。
位置指定 UPDATE の場合 :- カーソルの select-statement に update-clause を指定した場合、 この assignment-clause の各列名は、 その update-clause にも指定されていなければなりません。
- カーソルの select-statement に update-clause を指定せず、 アプリケーションのプリコンパイル時に LANGLEVEL MIA または SQL92E が指定されていた場合には、 更新可能な列の名前はいずれも指定することができます。
- カーソルの select-statement に update-clause 節を指定せず、 アプリケーションのプリコンパイル時に LANGLEVEL SAA1 を 明示的にまたはデフォルト値として指定していた場合には、列は更新できません。
..attribute-name - 設定されている構造化タイプの属性 (属性割り当て という) を指定します。 指定される column-name は、 ユーザー定義構造化タイプで定義されているものでなければなりません (SQLSTATE 428DP)。 attribute-name は、 column-name の構造化タイプの属性でなければなりません (SQLSTATE 42703)。 ..attribute-name 節と関係のない割り当ては、通常の割り当て と見なされます。 expression
- 列の新しい値を指定します。 expression は、
式
で説明したタイプの任意の式です。 スカラー fullselect で使用される場合を除き、集約関数を組み込むことはできません (SQLSTATE 42903)。expression には、 UPDATE ステートメントのターゲット表の列への参照を含めることができます。 更新対象の行ごとに、式の中のそのような列の値は、行の更新前のその行の列の値になります。
式に、INCLUDE 列への参照を含めることはできません。 expression が単一のホスト変数の場合は、拡張標識変数を使用できる標識変数をホスト変数に組み込めます。 拡張標識変数が使用可能であり、以下の内容のいずれかが該当する場合は、デフォルト (-5) または未割り当て (-7) の拡張標識変数の値は使用できません (SQLSTATE 22539)。
- 式が明示的キャストによる単一ホスト変数より複雑な場合
- ターゲット列のデータ・タイプが構造化タイプである
- ヌル
- NULL 値を指定します。NULL 可能列にのみ指定することができます (SQLSTATE 23502)。 NULL が特に属性のデータ・タイプにキャストされたのでない限り、 属性割り当ての値として NULL を使用することはできません (SQLSTATE 429B9)。
- DEFAULT
- 対応する列の表における定義方法に基づくデフォルト値を使用することを指定します。 挿入される値は、その列の定義方法によって異なります。
- 式に基づいて生成列として列が定義されている場合は、 その式に基づいた列の値がシステムによって生成されます。
- 列が IDENTITY 節で定義されている場合、値はデータベース・マネージャーによって生成されます。
- 列が WITH DEFAULT 節で定義されている場合、値は、その列に定義されたデフォルトに 設定されます (『
ALTER TABLE
』の default-clause を参照してください)。 - 列の定義に NOT NULL 節が使用されたが GENERATED 節が使用されなかった場合、 また WITH DEFAULT 節が使用されていない場合や DEFAULT NULL が使用されている場合は、 その列に DEFAULT キーワードを指定することはできません (SQLSTATE 23502)。
- ROW CHANGE TIMESTAMP 節を使って列が定義された場合、値はデータベース・マネージャーによって生成されます。
生成列が GENERATED ALWAYS 節で定義されている場合は、 DEFAULT 以外の値を挿入することはできません (SQLSTATE 428C9)。
属性割り当てでは、DEFAULT キーワードを値として使用することはできません (SQLSTATE 429B9)。
データ・ソースが DEFAULT 構文をサポートしていない場合に、 割り当てで DEFAULT キーワードを値として使用してニックネームに対する更新を行うことはできません。
行全選択 - 単一行を返す全選択を指定します。 結果列の値は、対応する各 column-name に割り当てられます。 全選択が行を返さなければ各列に NULL 値が割り当てられ、更新される列が NULL 可能でない場合はエラーが発生します。 結果に複数の行がある場合も、エラーが発生します。
row-fullselect (行全選択) には、 UPDATE ステートメントのターゲット表の列に対する参照を含めることができます。 更新対象の行ごとに、式の中のそのような列の値は、行の更新前のその行の列の値になります。 結果に行が複数ある場合、エラーが返されます (SQLSTATE 21000)。
- 更新する列を指定します。 拡張標識変数が使用可能でない場合は、column-name は、指定された表、ビュー、またはニックネームの更新可能列か、INCLUDE 列を識別しなければなりません。 型付き表のオブジェクト ID 列は更新できません (SQLSTATE 428DZ)。 ..attribute-name を付けて指定しない限り、
1 つの列を複数回指定することはできません (SQLSTATE 42701)。
- FROM
ターゲット表の列に割り当てる値を提供するソース表のリストを指定します。 結合条件を指定する WHERE 節によって、ソース表とターゲット表が暗黙的に内部結合されます。 ソース表の行の値を使用して、WHERE の条件を満たすターゲット表の行が更新されます。
UPDATE ステートメントで FROM 節を指定する場合は、以下のようになります。- 更新操作のターゲットとしてニックネームを指定することはできません。
- 更新操作のソースとして、analyze_table-expression (データ・マイニング・モデルの結果) や data-change-table-reference (ネストした UPDATE、DELETE、または INSERT のステートメントの結果) を指定することはできません。
table-referenceの説明については、 table-referenceを参照してください。
- WHERE
- この後に、更新する行を識別する条件を指定します。 この節は、省略することも、検索条件を指定することも、
またはカーソル名を指定することもできます。 この節を省略すると、表、ビュー、またはニックネームのすべての行が更新されます。
- 検索条件
- 副照会以外の検索条件の各列名 は、
表、ビュー、またはニックネームの列を指定していなければなりません。 検索条件に、同じ表が UPDATE と副照会の両方の基本オブジェクトである副照会が含まれている場合、
行が更新される前に、その副照会が完全に評価されます。
検索条件は、表、ビュー、またはニックネームの各行に適用され、検索条件の結果が「真」の行が更新されます。
検索条件に副照会が含まれる場合、その副照会は、 検索条件が 1 つの行に適用されるたびに実行され、 その結果は検索条件の適用に使用されるものと見なされます。 実際には、相関参照が含まれていない副照会は一度実行されるのに対し、 相関参照を含む副照会は各行ごとに一度ずつ実行しなければならない場合があります。
- CURRENT OF カーソル名
- 更新操作で使用するカーソルを指定します。 『
DECLARE CURSOR
』で説明されているように、cursor-nameは、宣言済みカーソルを指定しなければなりません。 プログラムで、UPDATE ステートメントよりも前に、 該当の DECLARE CURSOR ステートメントがなければなりません。指定する表、ビュー、またはニックネームは、そのカーソルの SELECT ステートメントの FROM 節でも指定されていなければならず、またそのカーソルの結果表が読み取り専用であってはなりません。 (読み取り専用の結果表については、
DECLARE CURSOR
を参照してください。)UPDATE ステートメントが実行される時点で、 そのカーソルは行に位置づけられていなければなりません。その行が更新されます。
この書式の UPDATE は、カーソルが次のものを参照している場合は使用できません (SQLSTATE 42828)。- INSTEAD OF UPDATE トリガーが定義されているビュー
- ビューを定義する全選択の選択リストに OLAP 関数が含まれているビュー
- WITH ROW MOVEMENT 節を使用して直接または間接的に定義されたビュー
order-by-clause - 副照会以外の検索条件の各列名 は、
表、ビュー、またはニックネームの列を指定していなければなりません。 検索条件に、同じ表が UPDATE と副照会の両方の基本オブジェクトである副照会が含まれている場合、
行が更新される前に、その副照会が完全に評価されます。
- offset-clause と fetch-clause を適用する行の順序を指定します。 offset-clause と fetch-clause に基づいて更新される行セットを確定するために、order-by-clause を指定して予測どおりの順序になるようにします。 order-by-clauseについて詳しくは、 order-by-clauseを参照してください。 オフセット文節
- 限定した行のサブセットをスキップして、更新の対象範囲を制限します。 offset-clauseについて詳しくは、 offset-clauseを参照してください。 フェッチ節
- 限定した行のサブセットだけに更新の対象範囲を制限します。 fetch-clauseについて詳しくは、 fetch-clauseを参照してください。
- WITH
- UPDATE ステートメントが実行される分離レベルを指定します。
- RR
- 反復可能読み取り
- RS
- 読み取り固定
- CS
- カーソル固定
- UR
- 非コミット読み取り
- SKIP LOCKED DATA
- SKIP LOCKED DATA 節では、他のトランザクションが行に対して非互換ロックを保持していて、ステートメントの進行が妨害される場合に、それらの行をスキップすることを指定します。 これらの行は、副照会でアクセスされている表も含め、ステートメントで記述されてアクセスされる表に属している可能性があります。 この節は、分離レベルが CS または RS の場合に適用され、分離レベル UR または RR が有効な場合は無視されます。 行レベルとブロック・レベルのロックに適用されます。
呼び出し
SKIP LOCKED DATA は、WITH RR または WITH UR の場合に指定されると無視されます。 ステートメントのデフォルト分離レベルは、ステートメントが バインドされているパッケージまたはプランの分離によって決まり、また結果表が読み取り専用かどうかによって決まります。 ステートメントのデフォルトの分離レベルが反復可能読み取りまたは非コミット読み取りの場合、SKIP LOCKED DATA は無視されます。
- NOWAIT / WAIT <time sec>
- 重要: 以下の機能は、 Db2 11.5.6 以降のバージョンで使用可能です。
NOWAIT 節と WAIT 節は、待機の開始から何秒経過したら、ロックをかけられなかったことを示すエラーが戻されるかを指定します。
WAIT 節を使用する場合、<time sec>
は -1 から 32767 までの整数です。注:WAIT 値としてNOWAIT
およびWAIT 0
の場合、ロックは待機されません。 要求時にロックが使用できない場合、-911 エラーが戻ります。-1
を指定すると、ロック・タイムアウトの検出がオフになります。 この状態では、次のいずれかのイベントが発生するまで、ロックを待機します (要求時にロックが使用可能でない場合)。- ロックが許可された。
- デッドロックが発生した。
位置指定の Update と Delete に関しては NOWAIT 節と WAIT 節は許可されませんが、カーソルの宣言でそれらの節を使用できます。 カーソル宣言で使用する場合、そのカーソルを使用するステートメントによって、指定の待ち時間値が継承されます。
ルール
- トリガー: UPDATE ステートメントによってトリガーの実行が引き起こされる場合があります。 トリガーが他のステートメントの実行を引き起こす場合や、 更新値に起因するエラーが発生する場合があります。 ビューに対する更新操作を行うと INSTEAD OF トリガーが起動する場合は、 そのトリガーによって実行される更新に対して妥当性、参照整合性、および制約が検査されます。 トリガーを起動させたビューやその基礎表に対する検査は行われません。
- 割り当て: 更新値は、 特定の割り当て規則に従って列に割り当てられます。
- 妥当性: 更新される列のユニーク索引がある場合には、
その表 (またはビューの基本表) に適用される制約に更新された行は、適合していなければなりません。
WITH CHECK OPTION を使用して定義されていないビューが使用される場合、 行が変更され、その結果、それらの行がそのビューの定義に適合しないことになる場合があります。 そのような行は、ビューの基本表で更新され、そのビューには現れなくなります。
WITH CHECK OPTION を用いて定義されたビューを使用する場合、 更新された行は、そのビューの定義に従っていなければなりません。 この状況に関連する規則については、
CREATE VIEW
を参照してください。 - チェック制約: 更新値は、表に定義されているチェック制約の検査条件を満たしていなければなりません。
チェック制約が定義されている表に対する UPDATE では、 更新される各行ごとに一度、更新される各列に対して制約条件が評価されます。 UPDATE ステートメントが処理される時点で、 更新される列を参照しているチェック制約だけが検査されます。
- 参照整合性: 更新規則が RESTRICT で、1 つまたは複数の従属行が存在する場合には、親のユニーク・キーの値は変更できません。 ただし、NO ACTION の更新規則では、 更新ステートメントの完了時にすべての子が親キーを持つ場合、 親のユニーク・キーを更新することができます。 NULL 以外の外部キーの更新値は、 関連する親表の主キーの値に等しくなければなりません。
- XML 値: XML 列の値を更新する場合、新しい値は整形式 XML 文書でなければなりません (SQLSTATE 2200M)。
- セキュリティー・ポリシー: 指定された表または指定されたビューの基本表がセキュリティー・ポリシーで保護されている場合、セッション許可 ID は、以下を許可するラベル・ベースのアクセス制御 (LBAC) 信用証明情報を持っている必要があります。
- 更新対象となる保護されたすべての列に対する書き込みアクセス (SQLSTATE 42512)
- RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL オプションを使って生成されたセキュリティー・ポリシーに関して DB2SECURITYLABEL 列に明示的に与えられる値に対する書き込みアクセス (SQLSTATE 23523)
- 更新対象となるすべての行に対する読み取りおよび書き込みアクセス (SQLSTATE 42519)
さらに、DB2SECURITYLABEL 列に暗黙的な値が使用される場合には、セキュリティー・ポリシーの書き込みアクセスに関するセキュリティー・ラベルもまた、セッション許可 ID に付与されている必要があります (SQLSTATE 23523)。このような暗黙的な値は、以下の場合に使用される可能性があります。
- DB2SECURITYLABEL 列が更新される列のリストに含まれていない (そのため、 SESSION 許可 ID の書き込みアクセスのセキュリティー・ラベルに暗黙的に更新される)
- DB2SECURITYLABEL 列の値が明示的に提供されているが、セッション許可 ID がその値に対する書き込みアクセスを持たず、OVERRIDE NOT AUTHORIZED WRITE SECURITY LABEL オプションを使ってセキュリティー・ポリシーが生成されている
- 拡張標識変数の使用法: 使用可能な場合は、0 (ゼロ) から -7 まで以外の標識変数値を入力にすることはできません (SQLSTATE 22010)。 また、デフォルトおよび未割り当ての拡張標識変数の値が使用可能な場合に、それらがサポートされないコンテキストで使用してはなりません (SQLSTATE 22539)。
- 拡張標識変数: UPDATE ステートメントの assignment-clause 内で、expression が単一のホスト変数か明示的にキャストされるホスト変数を参照する場合は、拡張標識変数の値が割り当てられる可能性があります。 未割り当ての拡張標識変数ベースの値が割り当てられると、その効果としてターゲット列は現行値の設定のままになり、ステートメント内で指定されていないかのように扱われます。 デフォルトの拡張標識変数ベースの値が割り当てられると、列のデフォルト値が割り当てられます。 データ・タイプのデフォルト値については、 「CREATE TABLE」ステートメントのDEFAULT 節の説明を参照してください。
ターゲット列が更新可能でない場合 (例えば、式として定義されているビュー内の列など)、未割り当ての拡張標識変数ベースの値を割り当てる必要があります (SQLSTATE 42808)。
ターゲット列が GENERATED ALWAYS として定義されている場合、DEFAULT キーワード、またはデフォルトか未割り当ての拡張標識変数ベースの値を割り当てる必要があります (SQLSTATE 428C9)。
UPDATE ステートメントが未割り当ての拡張標識変数ベースの値にすべてのターゲット列を割り当ててはなりません (SQLSTATE 22540)。
注
- 更新値が制約のいずれかに違反している場合、 または UPDATE ステートメントの実行時に他のエラーが発生した場合、行は更新されません。 複数の行が更新される順序は、決められていません。
- WITH ROW MOVEMENT 節を使用して定義されたビューへの更新は、 ビューの基礎表に対する削除操作および挿入操作を引き起こす可能性があります。 詳細は、CREATE VIEW ステートメントの説明を参照してください。
- UPDATE ステートメントの実行が完了すると、 SQLCA の SQLERRD(3) の値は更新操作用に修飾された行の数を示します。 SQL プロシージャー・ステートメントでは、 値は GET DIAGNOSTICS ステートメントの ROW_COUNT 変数を使用して検索できます。 SQLERRD(5) フィールドには、アクティブ化されたすべてのトリガーによって挿入、 削除、または更新された行の数が入れられます。
- 適切なロックが既に存在している場合を除き、 正常な UPDATE ステートメントの実行によって、1 つまたは複数の排他ロックが獲得されます。 そのようなロックが解放されるまで、更新された行には、 その更新を行ったアプリケーション・プロセス以外はアクセスできません (非コミット読み取り分離レベルを使用する アプリケーションを除く)。 ロッキングについては、COMMIT、 ROLLBACK、および LOCK TABLE の各ステートメントの説明を参照してください。
- 型付き表の列分布統計を更新する場合は、列を最初に生成した副表を指定しなければなりません。
- 同じ構造化タイプの列で複数の属性割り当てが行われる場合は、 SET 節で (括弧付きで挿入された SET 節では左から右の順番で) 指定された順に属性が割り当てられます。
- 属性割り当てでは、
ユーザー定義構造化タイプの属性に対して mutator メソッドが呼び出されます。 例えば、割り当て
st..a1=x
は、割り当てst = st..a1(x)
で mutator メソッドを使用した場合と同じ働きをします。 - 通常の割り当ての場合、 指定された列に対しては 1 つの割り当てしか行われませんが、 属性割り当てでは、1 つの列が複数の割り当てのターゲット列になることができます (ただし、 通常の割り当てでターゲット列として指定されていない場合)。
- 特殊タイプとして定義された ID 列が更新された場合は、 まずすべての計算がソース・タイプで行われます。 その結果は、値が列に実際に割り当てられる前に、 ソース・タイプから定義された特殊タイプにキャストされます。 (計算に先立って、元の値がソース・タイプにキャストされることはありません。)
- SET ステートメントで ID 列の値を生成するには、次のように DEFAULT キーワードを使用します。
この例では、NEW.EMPNO が ID 列として定義されており、この列の更新に使用される値が生成されます。SET NEW.EMPNO = DEFAULT
- ID 列に生成されるシーケンス値の使用に関する詳細、または ID 列で値が最大値を超えた場合の詳細は、『
INSERT
』を参照してください。 - パーティション表では、UPDATE WHERE CURRENT OF cursor-name 操作によって、あるデータ・パーティションから別のデータ・パーティションへ行を移動することができます。 その後、カーソルはその行の位置を示さなくなるため、その行に対して UPDATE WHERE CURRENT OF cursor-name 変更を行うことはできなくなります。 ただし、カーソルの次の行は取り出すことが可能です。
- ROW CHANGE TIMESTAMP 節を使って列が定義された場合、その値は行の更新時に常に変更されます。 列が SET リスト内に明示的に指定されていない場合でも、データベース・マネージャーはその行に関する値を生成します。 値はデータベース・パーティション内の各表パーティションごとに固有で、行の更新時を近似的に示すタイム・スタンプに設定されます。
- 拡張標識変数および更新トリガー: ターゲット列に未割り当ての拡張標識変数ベースの値が割り当てられている場合、その列は更新された列と見なされません。 その列は、ターゲット表で定義されるどの更新トリガーの OF column-name リストでも指定されなかったかのように扱われます。
- 拡張標識変数と据え置きエラー・チェック: 更新不能列への更新を認識するための妥当性検査は、拡張標識変数が使用可能でない場合にはステートメントの準備中に行われますが、静的 UPDATE ステートメントの列レベル更新特権チェックを除き、拡張標識変数が使用可能な場合はステートメントの実行まで据え置かれます。 エラーを報告する必要があるかどうかは、実行時のみ標識値に基づいて判別できます。 静的 UPDATE ステートメントの列レベル更新特権のチェックは、拡張標識変数が有効な場合であっても、バインド処理の間に引き続き実行されます。
- システム期間テンポラル表に関する考慮事項: ビューが WITH CHECK OPTION を指定して定義されていて、ビュー定義に以下のいずれかの構文要素を含む WHERE 節がある場合は、SYSTEM_TIME の期間指定が後に続く FROM 節でこのビューを参照する全選択を、UPDATE ステートメントのターゲットにしてはなりません (SQLSTATE 51046)。
- システム期間テンポラル表を (直接または間接的に) 参照する副照会
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し
CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターに ヌル以外の値が設定されている場合は、UPDATE ステートメントの基礎ターゲットを、 システム期間テンポラル表にしてはなりません (SQLSTATE 51046)。また、 ビュー定義に以下のいずれかの構文要素を含む WHERE 節があり、WITH CHECK OPTION を指定して定義されたビューを、UPDATE ステートメントのターゲットにしてはなりません (SQLSTATE 51046)。- システム期間テンポラル表を (直接または間接的に) 参照する副照会
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し
システム期間テンポラル表の行を更新すると、 データベース・マネージャーによって、行開始列およびトランザクション開始 ID 列が以下のように更新されます。- 行開始列に割り当てられる値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 行開始列の値は、トランザクション全体にわたり固有になるようにデータベース・マネージャーによって生成されます。 関連した履歴表に挿入される行の終了タイム・スタンプ値が開始タイム・スタンプ値より大きくなるように、タイム・スタンプ値が調整される可能性があります。これは、競合するトランザクションがシステム期間テンポラル表の同じ行を更新しているときに行われる場合があります。 このタイム・スタンプ値の調整を行うには、データベース構成パラメーター systime_period_adj を Yes に設定する必要があります。 単一の SQL トランザクション内で複数の行が更新され、調整が必要ではない場合、行開始列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
- トランザクション開始 ID 列には、トランザクションごとに固有のタイム・スタンプ値、または NULL 値が割り当てられます。トランザクション開始 ID 列が NULL 可能で、値を調整する必要がない行開始列が表にある場合には、その列に NULL 値が割り当てられます。 それ以外の場合、この値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 単一の SQL トランザクション内で複数の行が更新される場合、トランザクション開始 ID 列の値はすべての行において同じになり、別のトランザクションでその列のために生成された値とは異なる固有の値になります。
UPDATE ステートメントに、履歴行を参照する (明示的に履歴表の名前を参照するか、FROM 節の期間指定を使用することにより暗黙的に参照する) 相関副照会が含まれる検索条件がある場合、履歴行として (履歴表がある場合にはそこに) 挿入される更新行の古いバージョンは、そのステートメントにおいて以後処理される行の更新操作で可視になる可能性があります。
以下の状態の両方が当てはまる場合、UPDATE ステートメントのターゲットを、SYSTEM_TIME の期間指定が後に続く FROM 節でビューを参照する全選択にすることはできません (SQLSTATE 51046)。- ビューが WITH CHECK OPTION を指定して定義されている。
- ビュー定義に、以下の構文要素のいずれかを含む WHERE 節がある。
- システム期間テンポラル表を (直接または間接的に) 参照する副照会。
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し。
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し。
CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターに ヌル以外の値が設定されている場合は、UPDATE ステートメントの (直接または間接的な) 基礎ターゲットを、 システム期間テンポラル表にすることはできません (SQLSTATE 51046)。
CURRENT TEMPORAL SYSTEM_TIME 特殊レジスターに ヌル以外の値が設定されている場合は、 ビュー定義に以下のいずれかの構文要素を含む WHERE 節があり、WITH CHECK OPTION を指定して定義されたビューを、UPDATE ステートメントのターゲットにすることはできません (SQLSTATE 51046)。- システム期間テンポラル表を (直接または間接的に) 参照する副照会。
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し。
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し。
- 履歴表に関する考慮事項: システム期間テンポラル表の 1 つの行が更新されるとき、その行の履歴コピーが対応する履歴表に挿入され、履歴行の終了タイム・スタンプが、データ変更操作の時刻に対応するシステム判別値の形式でキャプチャーされます。 データベース・マネージャーが割り当てるこの値は、次のいずれかの場合に時刻機構を読み取ることによって生成されます。(1) トランザクションの中で、表に含まれる行開始列またはトランザクション開始 ID 列に値を割り当てる必要があるようなデータ変更ステートメントを最初に実行するとき。(2) システム期間テンポラル表に含まれる行を削除するとき。 終了列の値は、トランザクション全体の履歴表で固有になるようにデータベース・マネージャーによって生成されます。 履歴表に挿入される行の終了タイム・スタンプ値が開始タイム・スタンプ値より大きくなるように、タイム・スタンプ値が調整される可能性があります。これは、競合するトランザクションがシステム期間テンポラル表の同じ行を更新しているときに行われる場合があります (SQLSTATE 01695)。 このタイム・スタンプ値の調整を行うには、データベース構成パラメーター systime_period_adj を Yes に設定する必要があります。
更新操作では、この調整は、システム期間テンポラル表に関連付けられた履歴表の行終了列に対応する終了列の値にのみ影響があります。 この表への以降の参照ではこれらの調整を考慮に入れ、システム期間テンポラル表に関連付けられた期間の行開始列および行終了列に対応する列の値の中でトランザクション開始時刻が検索されるかどうかについて確認してください。
- アプリケーション期間テンポラル表に関する考慮事項: ビューが WITH CHECK OPTION を指定して定義されており、ビュー定義に以下のいずれかの構文エレメントを含む WHERE 節が含まれている場合、UPDATE ステートメントのターゲットは、BUSINESS_TIME の期間指定が後に続く FROM 節でビューを参照する全選択であってはなりません (SQLSTATE 51046)。
- アプリケーション期間テンポラル表を (直接または間接的に) 参照する副照会
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し
CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターに ヌル以外の値が設定されている場合は、 ビュー定義に以下のいずれかの構文要素を含む WHERE 節があり、WITH CHECK OPTION を指定して定義されたビューを、UPDATE ステートメントのターゲットにしてはなりません (SQLSTATE 51046)。- アプリケーション期間テンポラル表を (直接または間接的に) 参照する副照会
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し
アプリケーション期間のテンポラル表に対する UPDATE ステートメントに組み込む FOR PORTION OF BUSINESS_TIME 節で、指定した更新がどの 2 つの時刻間に有効になるかが示されます。 FOR PORTION OF BUSINESS_TIME を指定し、行開始列および行終了列の値で指定する行の期間値の一部分だけが value1 から value2 までで指定した期間に含まれる場合、その行は更新され、その行の変更されない部分を示す行が 1、2 行自動的に挿入されます。 表に対する更新操作の結果として自動的に挿入される行ごとに、アプリケーション期間のテンポラル表に対して生成される各列に新規の値が生成されます。 生成される列がユニーク・キー、主キー、参照制約の親キー、またはユニーク索引の一部として定義される場合、自動挿入によって制約または索引に違反する可能性があり、その場合にはエラーが返されます。
BUSINESS_TIME WITHOUT OVERLAPS 節が定義された主キー制約またはユニーク制約、または BUSINESS_TIME WITHOUT OVERLAPS 節が定義されたユニーク索引のいずれかを持つアプリケーション期間のテンポラル表に行を挿入するとき、期間 BUSINESS_TIME の開始列および終了列で定義される期間が、その表で同じユニーク制約またはユニーク索引を持つ別の行の期間 BUSINESS_TIME の開始列および終了列で定義される期間とオーバーラップする場合、エラーが返されます。
以下の状態の両方が当てはまる場合、UPDATE ステートメントのターゲットを、BUSINESS_TIME の期間指定が後に続く FROM 節でビューを参照する全選択にすることはできません (SQLSTATE 51046)。- ビューが WITH CHECK OPTION を指定して定義されている。
- ビュー定義に、以下の構文要素のいずれかを含む WHERE 節がある。
- アプリケーション期間テンポラル表を (直接または間接的に) 参照する副照会。
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し。
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し。
CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターに ヌル以外の値が設定されている場合は、 ビュー定義に以下のいずれかの構文要素を含む WHERE 節があり、WITH CHECK OPTION を指定して定義されたビューを、UPDATE ステートメントのターゲットにすることはできません (SQLSTATE 51046)。- アプリケーション期間テンポラル表を (直接または間接的に) 参照する副照会。
- 関連付けられたパッケージを持つ SQL ルーチンの呼び出し。
- NO SQL 以外のデータ・アクセス標識を持つ外部ルーチンの呼び出し。
アプリケーション期間テンポラル表が UPDATE ステートメントのターゲットであり、CURRENT TEMPORAL BUSINESS_TIME 特殊レジスターで有効な値が NULL 値ではなく、BUSTIMESENSITIVE BIND オプションが YES に設定されている場合、以下の述部が暗黙的に追加されます。bt_begin <= CURRENT TEMPORAL BUSINESS_TIME AND bt_end > CURRENT TEMPORAL BUSINESS_TIME
bt_begin
とbt_end
は、UPDATE ステートメントのターゲット表の BUSINESS_TIME 期間の開始列と終了列です。 - アプリケーション期間テンポラル表およびトリガーに関する考慮事項: ある行が更新されるときに、FOR PORTION OF BUSINESS_TIME 節が指定されている場合は、更新されなかった行の部分を表すために、追加の行が暗黙的に挿入される可能性があります。 更新される行に対して既存の更新トリガーがアクティブになり、暗黙的に挿入される行に対して既存の挿入トリガーがアクティブになります。
例
- 例 1: EMPLOYEE 表の従業員番号 (EMPNO) '000290' のジョブ (JOB) を 'LAB等' に変更します。
UPDATE EMPLOYEE SET JOB = 'LABORER' WHERE EMPNO = '000290'
- 例 2: PROJECT 表において、部門 (DEPTNO) 'D21' が担当しているすべてのプロジェクトについて、プロジェクトのスタッフ・レベル (PRSTAFF) を 1.5 増やします。
UPDATE PROJECT SET PRSTAFF = PRSTAFF + 1.5 WHERE DEPTNO = 'D21'
- 例 3: 部門 (WORKDEPT) 'E21' の管理者以外の全従業員が一時的に配置替えになったとします。 このことは、EMPLOYEE 表において、そのジョブ (JOB) を NULL 値に、
給与額 (SALARY、BONUS、COMM) をゼロに変更することにより示されます。
UPDATE EMPLOYEE SET JOB=NULL, SALARY=0, BONUS=0, COMM=0 WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'
このステートメントは、次のように書き換えることもできます。UPDATE EMPLOYEE SET (JOB, SALARY, BONUS, COMM) = (NULL, 0, 0, 0) WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'
- 例 4: 従業員番号 000120 の従業員の給与と歩合の列を、
それぞれ更新後の行の部門の従業員の平均給与と平均歩合に更新します。
前のステートメントは、意味的には次のステートメントと同等ですが、EMPLOYEE 表へのアクセスは 1 回だけ必要です。一方、次のステートメントは EMPLOYEE 表を 2 回指定します。UPDATE (SELECT EMPNO, SALARY, COMM, AVG(SALARY) OVER (PARTITION BY WORKDEPT), AVG(COMM) OVER (PARTITION BY WORKDEPT) FROM EMPLOYEE E) AS E(EMPNO, SALARY, COMM, AVGSAL, AVGCOMM) SET (SALARY, COMM) = (AVGSAL, AVGCOMM) WHERE EMPNO = '000120'
UPDATE EMPLOYEE EU SET (EU.SALARY, EU.COMM) = (SELECT AVG(ES.SALARY), AVG(ES.COMM) FROM EMPLOYEE ES WHERE ES.WORKDEPT = EU.WORKDEPT) WHERE EU.EMPNO = '000120'
- 例 5: C プログラムでは、EMPLOYEE 表の行を表示してから、要求があれば、特定の従業員のジョブ (JOB) を、キー入力された新しいジョブに変更します。
EXEC SQL DECLARE C1 CURSOR FOR SELECT * FROM EMPLOYEE FOR UPDATE OF JOB; EXEC SQL OPEN C1; EXEC SQL FETCH C1 INTO ... ; if ( strcmp (change, "YES") == 0 ) EXEC SQL UPDATE EMPLOYEE SET JOB = :newjob WHERE CURRENT OF C1; EXEC SQL CLOSE C1;
- 例 6: これらの例では、
列オブジェクトの属性を変化させます。以下のタイプと表が存在すると想定します。
CREATE TYPE POINT AS (X INTEGER, Y INTEGER) NOT FINAL WITHOUT COMPARISONS MODE DB2SQL
CREATE TYPE CIRCLE AS (RADIUS INTEGER, CENTER POINT) NOT FINAL WITHOUT COMPARISONS MODE DB2SQL
CREATE TABLE CIRCLES (ID INTEGER, OWNER VARCHAR(50), C CIRCLE
以下の例では、CIRCLES 表を更新して、OWNER 列と、ID が 999 の CIRCLE 列の RADIUS 属性を変更します。UPDATE CIRCLES SET OWNER = 'Bruce' C..RADIUS = 5 WHERE ID = 999
以下の例では、999 で識別される円の中心の X 座標と Y 座標を転置します。UPDATE CIRCLES SET C..CENTER..X = C..CENTER..Y, C..CENTER..Y = C..CENTER..X WHERE ID = 999
以下の例は、 前述のステートメントの両方を別の方法で記述したものです。 この例では、上の例に示した両方のステートメントの働きを結合させています。UPDATE CIRCLES SET (OWNER,C..RADIUS,C..CENTER..X,C..CENTER..Y) = ('Bruce',5,C..CENTER..Y,C..CENTER..X) WHERE ID = 999
- 例 7: DOCID が '001' の場合に、DOCUMENTS 表の XMLDOC 列を、XMLTEXT 表から選択した解析済みの文字ストリングに更新します。
UPDATE DOCUMENTS SET XMLDOC = (SELECT XMLPARSE(DOCUMENT C1 STRIP WHITESPACE) FROM XMLTEXT WHERE TEXTID = '001') WHERE DOCID = '001'
- 例 8: project 表に新しい location 列が追加されました。 プロジェクトの場所を、プロジェクトを担当する部門の場所に更新します。
UPDATE PROJECT P SET P.LOCATION = D.LOCATION FROM DEPARTMENT D WHERE P.DEPTNO = D.DEPTNO;
- 例 9: プロジェクトの人員見積もり数を、プロジェクトに含まれている全アクティビティーで必要な最大人員数に更新します。
UPDATE PROJECT P SET P.PRSTAFF = S.ACSTAFF FROM (SELECT PROJNO, MAX(ACSTAFF) ACSTAFF FROM PROJACT GROUP BY PROJNO) S WHERE P.PROJNO = S.PROJNO AND P.PROJNAME = 'PAYROLL PROGRAMMING';
- 例 10: 従業員の部門を、割り当て先のプロジェクトの部門に更新します。
UPDATE EMPLOYEE E SET E.WORKDEPT = P.DEPTNO FROM PROJECT P JOIN EMPPROJACT EP ON P.PROJNO = EP.PROJNO WHERE E.EMPNO = EP.EMPNO AND E.FIRSTNME = 'PHILIP' AND E.LASTNAME = 'SMITH';