SQL 解説書

UPDATE

UPDATE ステートメントは、表または視点の行の指定された列の値を更新します。 視点の行の更新により、その基礎表の行が更新されます。

このステートメントの形式は以下のとおりです。

呼び出し

UPDATE ステートメントは、アプリケーション・プログラムに組み込むか、 あるいは動的 SQL ステートメントの使用によって発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。

許可

このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。

副照会によって参照される表または視点のそれぞれに対して、 このステートメントの許可 ID が持つ特権には以下の少なくとも 1 つが含まれている必要があります。

パッケージが SQL92 規則を使用してプリコンパイルされており 107 、 UPDATE の探索条件付き形式で assignment-clause の右側 または search-condition のいずれかの個所に表または視点の列への参照が含まれている場合、 このステートメント許可 ID が持つ特権には、 さらに以下の少なくとも 1 つが含まれている必要があります。

指定した表または視点が ONLY キーワードの後にくる場合、 ステートメントの許可 ID が持つ特権にも、 指定した表または視点の副表または副視点ごとに SELECT 特権が含まれている必要があります。

静的 UPDATE ステートメントの場合、GROUP 特権は検査されません。

構文

Searched (探索条件付き) UPDATE:

>>-UPDATE----+-table-name-------------------+------------------->
             +-view-name--------------------+
             '-ONLY--(--+-table-name-+---)--'
                        '-view-name--'
 
>-----+---------------------------+----------------------------->
      | .-AS-.                    |
      '-+----+--correlation-name--'
 
>-----SET--|  assignment-clause |------------------------------->
 
>-----+--------------------------+-----------------------------><
      '-WHERE--search-condition--'
 

Positioned (位置指定) UPDATE:

>>-UPDATE----+-table-name-------------------+------------------->
             +-view-name--------------------+
             '-ONLY--(--+-table-name-+---)--'
                        '-view-name--'
 
>-----SET--|  assignment-clause |------------------------------->
 
>-----WHERE CURRENT OF--cursor-name----------------------------><
 
 assignment-clause
 
    .-,---------------------------------------------------------------------------------------------------------.
    V                                                                                                           |
|-------+-column-name--+--------------------------+---=--+-expression-+--------------------------------------+--+->
        |              |  .--------------------.  |      +-NULL-------+                                      |
        |              |  V                    |  |      '-DEFAULT----'                                      |
        |              '----..attribute-name---+--'                                                          |
        |    .-,-------------------------------------------.               .-,----------------------.        |
        |    V                                             |               V                 (1)    |        |
        '-(-----column-name--+--------------------------+--+---)--=--(--+----+-expression-+---------+-+---)--'
                             |  .--------------------.  |               |    +-NULL-------+           |
                             |  V                    |  |               |    '-DEFAULT----'           |
                             '----..attribute-name---+--'               |                (2)          |
                                                                        '-row-fullselect--------------'
 
>---------------------------------------------------------------|
 

注:

  1. expression、NULL、および DEFAULT の数は、 column-name の数と同じでなければなりません。

  2. 選択リスト中の列の数は、 column-name の数と同じでなければなりません。

説明

table-name または view-name
更新する表または視点の名前です。 この名前は、カタログに記述されている表または視点を指定する名前でなければならず、 カタログ表、カタログ表の視点 (更新可能な SYSSTAT 視点を除く)、 要約表、読み取り専用の視点、またはニックネームを指定することはできません。 (読み取り専用の視点については、CREATE VIEW を参照してください。 更新可能なカタログ視点については、付録 D, カタログ視点を参照してください。)

table-name がタイプ付き表である場合は、 このステートメントを使用すれば、その表またはそれに関係する副表の行を更新できます。 WHERE 節に設定または参照できるのは、指定された表の列だけです。 位置指定 UPDATE の場合は、FROM 文節に指定されているのと同じ表または視点を、 関連するカーソルにも ONLY を使用せずに指定しなければなりません。

ONLY (table-name)
タイプ付き表の場合に適用できます。 ONLY キーワードは、指定した表のデータだけをステートメントが適用し、 その表に関係する副表の行は更新できないことを指定します。 位置指定 UPDATE の場合は、FROM 文節に指定されているのと同じ表を、 関連するカーソルにも ONLY を使用して指定しなければなりません。 table-name がタイプ付き表でない場合は、 このステートメントに ONLY を使用しても効果はありません。

ONLY (view-name)
タイプ付き視点の場合に適用できます。 ONLY キーワードは、指定された視点のデータだけをステートメントが適用し、 その表に関係する副視点の行は更新できないことを指定します。 位置指定 UPDATE の場合は、FROM 文節に指定されているのと同じ視点を、 関連するカーソルにも ONLY を指定して指定しなければなりません。 view-name がタイプ付き視点でない場合は、 このステートメントに ONLY キーワードを使用しても効果はありません。

AS
correlation-name (相関名) の前に任意に指定できるキーワードです。

correlation-name
探索条件 (search-condition) の中で、 表または視点を指定するのに使用することができます。 (相関名については、相関名 を参照してください。)

SET
この後に、列名への値の割り当て (assignment-clause) を指定します。

assignment-clause

column-name
更新したい列を指定します。 column-name (列名) は、 指定した表または視点の更新可能な列を指定していなければなりません。 108 タイプ付き表のオブジェクト識別子列は更新できません (SQLSTATE 428DZ)。 属性名 (attribute-name) を付けて指定しない限り、 1 つの列を 2 回以上指定することはできません (SQLSTATE 42701)。

位置指定 UPDATE の場合 :

  • カーソルの選択ステートメントに UPDATE 文節を指定した場合、 この assignment-clause の各列名は、 その UPDATE 文節にも指定されていなければなりません。
  • カーソルの選択ステートメントに UPDATE 文節を指定せず、 アプリケーションのプリコンパイル時に LANGLEVEL MIA または SQL92E が指定されていた場合には、 更新可能な列の名前はいずれも指定することができます。
  • カーソルの選択ステートメントに UPDATE 文節を指定せず、 アプリケーションのプリコンパイル時に LANGLEVEL SAA1 を 明示的にまたはデフォルト値として指定していた場合には、列は更新できません。

..attribute-name
設定されている構造タイプの属性 (属性割り当て という) を指定します。 指定される column-name は、 ユーザー定義構造タイプで定義されているものでなければなりません (SQLSTATE 428DP)。 attribute-name は、 column-name の構造タイプの属性でなければなりません (SQLSTATE 42703)。 ..attribute-name 文節と関係のない割り当ては、 通常の割り当て とみなされます。

expression
列の新しい値を指定します。 この expression (式) として、 で説明されているタイプの式はいずれも使用することができます。 スカラー全選択に現れる式を除き、 この式に列関数を含めることはできません (SQLSTATE 42903)。

expression には、 UPDATE ステートメントのターゲット表の列への参照を含めることができます。 更新対象の行ごとに、式の中のそのような列の値は、行の更新前のその行の列の値になります。

NULL
ヌル値を指定します。 これはヌル値可能な列に対してのみ指定することができます (SQLSTATE 23502)。 NULL が特に属性のデータ・タイプにキャストされたのでない限り、 属性割り当ての値として NULL を使用することはできません (SQLSTATE 429B9)。

DEFAULT
対応する列の表における定義方法に基づくデフォルト値を使用することを指定します。 挿入される値は、その列の定義方法によって異なります。
  • 式に基づいて生成された列として列が定義されている場合は、 その式に基づいた列の値がシステムによって生成されます。
  • IDENTITY 文節を使用して列が定義された場合は、 データベース・マネージャーによって値が生成されます。
  • 列が WITH DEFAULT 文節を指定して定義されている場合、 値はその列に対して定義されたデフォルト値に設定されます (ALTER TABLE の default-clause を 参照してください)。
  • WITH DEFAULT 文節、GENERATED 文節、 および NOT NULL 文節のいずれも指定せずに列が定義された場合は、値 NULL が使用されます。
  • 列の定義に NOT NULL 文節が使用されたが GENERATED 文節が使用されなかった場合、 また WITH DEFAULT 文節が使用されていない場合や DEFAULT NULL が使用されている場合は、 その列に DEFAULT キーワードを指定することはできません (SQLSTATE 23502)。

生成された列が GENERATED ALWAYS 文節で定義されている場合は、 DEFAULT 以外の値を挿入することはできません (SQLSTATE 428C9)。

属性割り当てでは、DEFAULT キーワードを値として使用することはできません (SQLSTATE 429B9)。

row-fullselect
割り当て式に指定した列名 の数に対応する数の列を含む 1 つの行を戻す全選択です。 値は、それぞれ対応する列名 に割り当てられます。 この行全選択 の結果の行がない場合は、NULL 値が割り当てられます。

row-fullselect (行全選択) には、 UPDATE ステートメントのターゲット表の列に対する参照を含めることができます。 更新対象の行ごとに、式の中のそのような列の値は、 行の更新前のその行の列の値になります。 結果に複数の行が含まれる場合には、エラーになります (SQLSTATE 21000)。

WHERE
この後に、更新したい行を識別する条件を指定します。 この文節は、省略することも、探索条件を指定することも、 またはカーソル名を指定することもできます。 この文節を省略すると、表または視点のすべての行が更新されます。

search-condition
言語要素 の説明に基づいて、探索条件を指定します。 副照会以外の探索条件の各列名 は、 表または視点の列を指定していなければなりません。 探索条件に、同じ表が UPDATE と副照会の両方の基本オブジェクトである副照会が含まれている場合、 行が更新される前に、その副照会が完全に評価されます。

探索条件は、表または視点の各行に適用され、探索条件の結果が「真」の行が更新されます。

探索条件に副照会が含まれる場合、その副照会は、 探索条件が 1 つの行に適用されるたびに実行され、 その結果は探索条件の適用に使用されるものとみなされます。 実際には、相関参照が含まれていない副照会は一度実行されるのに対し、 相関参照を含む副照会は各行ごとに一度ずつ実行しなければならない場合があります。

CURRENT OF cursor-name
更新操作で使用するカーソルを指定します。 DECLARE CURSOR で説明されているように、 cursor-name (カーソル名) は、 宣言されたカーソルを識別していなければなりません。 プログラムで、UPDATE ステートメントよりも前に、 該当の DECLARE CURSOR ステートメントがなければなりません。

指定する表または視点は、 そのカーソルの SELECT ステートメントの FROM 文節でも指定されていなければならず、 またそのカーソルの結果表が読み取り専用であってはなりません。 (読み取り専用の結果表については、DECLARE CURSOR を参照してください。)

UPDATE ステートメントが実行される時点で、 そのカーソルは行に位置づけられていなければなりません。その行が更新されます。

視点を定義する全選択の選択リストの OLAP 関数を含む視点を更新する場合は、 この形式の UPDATE を使用することはできません (SQLSTATE 42828)。

規則


脚注:

107
ステートメントの処理に使用されるパッケージは、 値 SQL92E または MIA を指定したオプション LANGLEVEL を使用してプリコンパイルされます。

108
区分化キーの列は更新できません (SQLSTATE 42997)。 区分化キーの列を変更するには、そのデータの行を削除して挿入し直す必要があります。

109
計算に先立って、元の値がソース・タイプにキャストされることはありません。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]