ページの先頭行へ戻る
Symfoware Server V11.0.x SQLリファレンス
Symfoware

3.67 UPDATE文:探索

機能

探索条件を満たす列の値を更新します。

記述形式

構文の構成

参照項番

権限

一般規則

表名
  • 更新する表の名前を指定します。

  • 表名の有効範囲はUPDATE文:探索の全体となります。

  • 表名で指定した表が“WITH CHECK OPTION”を指定したビュー表の場合、更新する値はビュー表の探索条件に対して真でなければなりません。そうでなければ、例外(制約違反)となります。

  • 表名で指定した表を、副問合せのFROM句に指定することはできません。このとき、表名で指定した表がビュー表の場合、そのビュー表に含まれる表が対象となります。

  • 表名で指定した表に、トリガ事象にUPDATEを指定したトリガを定義している場合、被トリガSQL文中に指定した表名と同じ表名を副問合せのFROM句に指定することはできません。表名がビュー表の場合、そのビュー表に含まれる表が対象になります。

  • 表名にOBJECT構造の表を指定することはできません。

設定句
  • 設定句で指定した列は、値式、NULL値または既定値に変更されます。

  • 設定句の値式に含まれる列指定が、UPDATE文:探索の対象となる表の列を指定しているとき、取り出される列の値は、更新される前の値です。

列名
  • 列名は、更新する列の名前を指定します。

  • 設定句に指定する列名は、表名で指定した表の列であることが必要です。また、同じ列名を複数回指定することはできません。

値式
  • 設定句で指定する値式に集合関数指定を指定することはできません。

  • 設定句で指定する値式のデータ型は、更新対象の列のデータ型に代入可能であることが必要です。

  • 更新対象の列のデータ型が文字列型で、値式のデータ型が真数型、概数型または日時型の場合、値式のデータを文字列型に暗黙的に型変換して代入します。

  • 更新対象の列のデータ型が真数型で、値式のデータ型が文字列型の場合、値式のデータを真数型に暗黙的に型変換して代入します。

  • 更新対象の列のデータ型が概数型で、値式のデータ型が文字列型の場合、値式のデータを概数型に暗黙的に型変換して代入します。

  • 更新対象の列のデータ型が日時型で、値式のデータ型が文字列型の場合、値式のデータを日時型に暗黙的に型変換して代入します。

列のデータ型が文字列型の場合:

値式のデータ型は文字列型、真数型、概数型または日時型であることが必要です。真数型/概数型または日時型が指定できるのは、値式を定数または変数指定で指定した場合のみです。

列のデータ型が各国語文字列型の場合:

値式のデータ型は各国語文字列型であることが必要です。

列のデータ型が真数型の場合:

値式のデータ型は真数型、概数型または文字列型であることが必要です。文字列型が指定できるのは、値式を定数または変数指定で指定した場合のみです。値式のデータ型が文字列型の場合、データは符号つき数定数の形式になるように指定してください。

1

UPDATE 会社管理.従業員表 SET 従業員番号 = '123'
→ 文字列データ'123'を真数型に型変換して代入します。

2

UPDATE 会社管理.従業員表 SET 従業員番号 = 'F123'
→ 結果はエラーとなります。文字列データは、符号つき数定数の形式で指定する必要があります。

列のデータ型が概数型の場合:

値式のデータ型は真数型、概数型または文字列型であることが必要です。文字列型が指定できるのは、値式を定数または変数指定で指定した場合のみです。値式のデータ型が文字列型の場合、データは符号つき数定数の形式になるように指定してください。

列のデータ型がDATE型の場合:

値式のデータ型は文字列型またはDATE型であることが必要です。文字列型が指定できるのは、値式を定数または変数指定で指定した場合のみです。値式のデータ型が文字列型の場合、データは日時定数の形式になるように指定してください。

1

UPDATE 会社管理.従業員表 SET 営業日 = '2007-01-02'
→ 文字列データ'2007-01-02'をDATE型に型変換して代入します。

2

UPDATE 会社管理.従業員表 SET 営業日 = '2007/1/2'
→ 結果はエラーとなります。文字列データは、日時定数の形式で指定する必要があります。

列のデータ型がTIME型の場合:

値式のデータ型は文字列型またはTIME型であることが必要です。文字列型が指定できるのは、値式を定数または変数指定で指定した場合のみです。値式のデータ型が文字列型の場合、データは日時定数の形式になるように指定してください。

列のデータ型がTIMESTAMP型の場合:

値式のデータ型は文字列型またはTIMESTAMP型であることが必要です。文字列型が指定できるのは、値式を定数または変数指定で指定した場合のみです。値式のデータ型が文字列型の場合、データは日時定数の形式になるように指定してください。

列のデータ型が時間隔型の場合:

値式のデータ型は文字列型、真数型または時間隔型であることが必要です。文字列型、真数型が指定できるのは、値式を変数指定で指定した場合のみです。真数型を指定する場合、更新対象の列のデータ型が単一日時フィールドで指定された時間隔型でなければなりません。

列のデータ型がBLOB型の場合:

値式のデータ型はBLOB型であることが必要です。

NULL
  • NULLを指定するときは、対応する列がNULL値を許していることが必要です。

DEFAULT
  • DEFAULTを指定する場合は、表定義時にDEFAULT句を設定していないと、NULLが設定されます。表定義時にDEFAULT句を指定していればそのDEFAULT値が設定されます。

対象列
  • 更新値が対象列に設定されるときの規則は次のようになります。

    文字列型データの場合:

    更新値の右側の空白を除くデータ長が対象列の長さと同じ場合は、文字データがそのまま設定されます。更新値の右側の空白を除くデータ長が対象列の長さよりも短い場合は、更新値が対象列の左側から設定され、対象列の残り部分には空白が設定されます。更新値の右側の空白を除くデータ長が対象列の長さよりも長い場合は、データ例外(文字データのトランケート)となります。

    各国語文字列型の場合:

    文字列型の場合と同じように設定されます。

    真数型の場合:

    対象列のデータ型に変換して設定されます。更新値の整数部が対象列の精度と位取りで表現できる場合は、対象列の精度と位取りに従って設定されます。上位の桁落ちが発生する場合は例外事象となり、下位の位が落ちる場合は切り捨てられます。

    概数型のデータの場合:

    対象列には、更新値の概数値が設定されます。

    日時型のデータの場合:

    対象列のデータ型に変換して設定されます。

    時間隔型のデータの場合:

    対象列のデータ型に変換して設定されます。ただし、時間隔型が年月の場合は年月のデータ型に、時間隔型が日時の場合は日時のデータ型にそれぞれ設定されます。

    BLOB型のデータの場合:

    対象列には、更新値のバイナリ値が設定されます。

探索条件
  • 探索条件を指定した場合、探索条件が真となる行が更新の対象となります。

  • 探索条件を省略した場合、表のすべての行が更新の対象となります。

  • 探索条件によって真となる行が存在しなかった場合、または表に行が存在しなかった場合、例外(データなし)となります。

  • 探索条件の副問合せに指定した導出表にはORDER BY句を指定することはできません。

DESCRIBE情報について
  • 設定句の値式に動的パラメタ指定が指定された場合のDESCRIBE情報は、対応する列のデータ型になります。

実行オプション指定
  • 実行オプション指定は、占有モードを指定します。

占有モード指定
  • 占有モード指定は、問合せ指定を指定した場合に、問合せ指定のデータベース資源の占有の方法を指定します。

  • 占有モードを指定したSQL文が読み込んだデータベース資源は、占有モード指定により、以下のようにデータベース資源を占有します。なお、更新する行は占有モード指定にかかわらず、非共有モードでトランザクションの終了までデータベース資源を占有します。

    占有モード指定

    占有の方法

    EXCLUSIVE LOCK

    非共有モードでトランザクション終了までデータベース資源を占有します。

    SHARE LOCK

    共有モードでトランザクション終了までデータベース資源を占有します。

    FREE LOCK

    共有モードでSQL文終了までデータベース資源を占有します。

    NO LOCK

    データベース資源を占有しません。

  • 占有モードを指定したSQL文によって読み込まれた資源は、SET TRANSACTION文で指定された内容にかかわらず、以下のようになります。

    占有モード指定

    読込み水準

    EXCLUSIVE LOCK

    他のトランザクションによって占有されていない行を読み込みます。当該SQL文で読み込んだ行は、トランザクション終了まで他のトランザクションに更新されることはないため、一度読み込んだ行は他のトランザクションによって更新されないことが保証されます。

    SHARE LOCK

    他のトランザクションによって占有されていないか、または共有モードで資源を占有されている行を読み込みます。当該SQL文で読み込んだ行は、トランザクション終了まで他のトランザクションに更新されることはないため、一度読み込んだ行は他のトランザクションによって更新されないことが保証されます。

    FREE LOCK

    他のトランザクションによって占有されていないか、または共有モードで資源を占有されている行を読み込みます。当該SQL文で読み込んだ行は、他のトランザクションに更新されることがあるため、同一トランザクションで再検索すると最新の結果を検索することができます。

    NO LOCK

    他のトランザクションでどのような占有をされた資源でも参照することが可能なため、同一トランザクションで再検索すると最新の結果を検索することができます。

  • 占有モードの単位は、R_LOCKがYESの場合は行単位となります。R_LOCKがNOの場合は、ページ単位またはDSI単位の占有になります。

  • 動作環境パラメタにDSO_LOCKを指定したり、環境変数でRDBDSOを指定した場合、占有モードを指定したSQL文は実行できません。


使用例

例1

表TBL1の探索条件が真となる行を更新する例を示します。

UPDATE TBL1
       SET COL1 = 100, COL2 = NULL
       WHERE COL1 = 20 OR COL3 = 5

表TBL1の行のうち探索条件を満たす行の列COL1と列COL2の値が、それぞれ100とNULL値になります。このとき、COL2はNULL値が許されない列であってはいけません。


例2

他のアプリケーションの処理待ちを少なくする例を示します。

UPDATE 在庫管理.在庫表 SET COL1 = 2 WHERE COL1 = 20
       WITH OPTION LOCK_MODE(NO LOCK)

例3

デッドロックの抑止を考慮した使い方の例を示します。インデックスの構成列はCOL1とします。

UPDATE 在庫管理.在庫表 SET COL1 = 2 WHERE COL1 = 20
       WITH OPTION LOCK_MODE(EXCLUSIVE LOCK)