{ 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文が実行されると、その文は無効となります。
別名を破棄すると、その別名を使っている更新の準備された文は無効になります。
更新の対象表にてトリガの破棄や作成が行われると、更新の文は無効になります。