SQL UPDATE

SQLのUPDATE文は、表に存在する行を更新する。UPDATE文はDMLの一種であり、コミットすることで更新が確定される。更新対象がロックされている場合は、ロックが解除されるまで待つ。

構文

UPDATE [schema.]table
  SET column = value [, ...]
  [WHERE condition]
schema
更新するテーブルが存在するスキーマを指定する。更新するテーブルが自分のスキーマ内にある場合は、スキーマ名の指定を省略できる。
SQL> UPDATE tsuka.emp SET comm = null;
table
更新する表を指定する。
SQL> UPDATE emp SET comm = null;
column
更新する列を指定する。カンマで区切って、複数の列と値の組み合わせを指定できる。
SQL> UPDATE emp SET comm = null, mgr = null
value
更新する値を指定する。
condition
更新するレコード(行)の条件を指定する。

UPDATEで更新するレコードに条件を指定したい場合は、WHERE句で条件を指定する。更新対象が複数行ある場合は、それらのすべてを更新する。更新対象が無い場合は、何も更新せず、エラーにもならない。

SQL> UPDATE emp SET comm = 0 WHERE comm IS null;

複数行UPDATE

社員表(emp)のすべてのレコードについて、部署番号列(deptno)を更新する。

UPDATE emp SET deptno = 10

自分のスキーマ内以外にあるテーブルを更新するには、スキーマ名も指定する。

UPDATE schema1.emp SET deptno = 10

複数カラム(列)UPDATE

社員表のすべてのレコードについて、歩合給(comm)と部署番号列を更新する。

UPDATE emp SET comm = NULL, deptno = 10

UPDATEに必要な権限

自分のスキーマ内にある表の行を更新するには、とくに権限は必要ない。

更新するテーブルが自分のスキーマ内にない場合は、更新するテーブルに対するUPDATEオブジェクト権限が必要である。

トランザクション制御

UPDATEで更新した内容は、まだ確定されていない。変更内容を確定するには、コミットする必要がある。

UPDATE emp SET deptno = 10
COMMIT

コミットする前であれば、UPDATEで更新した内容を元に戻すことができる。変更内容をキャンセルするには、ロールバックする。

UPDATE emp SET deptno = 10
ROLLBACK

サンプル

値をNULLに更新する。

SQL> UPDATE emp SET comm = NULL;

値がNULLのときに更新する。

SQL> UPDATE emp SET comm = 0 WHERE comm IS NULL;

値がNULLのときは更新しない。

SQL> UPDATE emp SET comm = comm * 2 WHERE comm IS NOT NULL;

副問合せの結果で条件を指定する。

SQL> UPDATE emp SET sal = sal + 100 WHERE emp.deptno IN (SELECT dept.deptno FROM dept WHERE loc = 'LONDON');
SQL> UPDATE emp SET sal = sal + 100 WHERE EXISTS (SELECT deptno FROM dept WHERE emp.deptno = dept.deptno AND loc = 'LONDON');

副問合せの結果で値を指定する。

SQL> UPDATE emp SET sal = (SELECT sal FROM salary WHERE emp.deptno = salary.deptno);

制約

行を更新する列に対して整合性制約が設定されていることがある。この場合、整合性制約に違反する値で更新しようとすると、エラーが発生する。

行1でエラーが発生しました。:
ORA-02290: チェック制約(XXXX.AGECHECK)に違反しました

関連SQL

COMMIT
トランザクションをコミットする。
DELETE
テーブル等からレコードを削除する。
INSERT
テーブル等にレコードを挿入する。
ROLLBACK
トランザクションをロールバックする。
SELECT
テーブル等からレコードを問い合わせる。