# UPDATE文

#### 構文

    {
        UPDATE 表名
            SET 列名 = 値
            [ , 列名 = 値} ]*
            [WHERE節] |
        UPDATE 表名
            SET 列名 = 値
            [ , 列名 = 値 ]*
            WHERE CURRENT OF
    }

値の定義は以下の通りです。

    式 | DEFAULT

一つ目の書き方は検索による更新といい、WHERE節が真に評価される全行の一つ以上の列を更新します。

二つ目の書き方は位置による更新といい、更新可能な開いたカーソルの現在行の一つ以上の列を更新します。カーソルを作成するSELECT文のFOR UPDATE 節にて列が明示された場合、その列だけが更新可能です。もし列が明示されていないかSELECT文にFOR UPDATE節が無かった場合は、全ての列を更新できます。

更新後の値にDEFAULTを指定すると、表にて定義された既定値に列の値が設定されます。

#### 例

    -- 'E21'の部署(WORKDEPT)にて管理者以外が一時的に再配属されている。
    -- このことを、EMPLOYEEという表の彼らの仕事(JOB)をNULLに、
    -- 彼らへの支払い(SALARY, BONUS, COMM)を0にしてあらわす。
    UPDATE EMPLOYEE
      SET JOB=NULL, SALARY=0, BONUS=0, COMM=0
      WHERE WORKDEPT = 'E21' AND JOB <> 'MANAGER'

    -- 特定の肩書きを持たない社員を管理者に昇格する。
    UPDATE EMPLOYEE
    	SET JOB = 'MANAGER'
    	WHERE JOB IS NULL;
    // 全てのプロジェクトの人員配置(PRSTAFF)を1.5増やす。
    stmt.executeUpdate("UPDATE PROJECT SET PRSTAFF = "
    "PRSTAFF + 1.5" +
    "WHERE CURRENT OF" + ResultSet.getCursorName());

    -- EMPLOYEEという表にて社員番号(EMPNO)が'000290'の社員の仕事(JOB)を、
    -- 既定値であるNULLに更新する。
    UPDATE EMPLOYEE
      SET JOB = DEFAULT
      WHERE EMPNO = '000290'

#### 文の依存

検索による更新の文は、更新しようとしている表や、そのコングロマリット(ヒープや索引などの記録単位)、その制約、WHERE節やSET式に書かれた表に依存します。検索による更新の準備された文の対象表にCREATE INDEXやDROP INDEX文、ALTER TABLE文が実行されると、その文は無効となります。

位置による更新の文はカーソルやカーソルが参照する全ての表に依存します。カーソルがまだ開いていなくとも、位置による更新の文をコンパイルすることができます。しかしながらJDBCのcloseメソッドにより開いたカーソルをなくすと、位置による更新の文は無効となります。

位置による更新の準備された文の対象表に、CREATE INDEXやDROP INDEX文、ALTER TABLE文が実行されると、その文は無効となります。

別名を破棄すると、その別名を使っている更新の準備された文は無効になります。

更新の対象表にてトリガの破棄や作成が行われると、更新の文は無効になります。

親トピック: 文