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文が実行されると、その文は無効となります。

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

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