SQLのUPDATE文は、表に存在する行を更新する。UPDATE文はDMLの一種であり、コミットすることで更新が確定される。更新対象がロックされている場合は、ロックが解除されるまで待つ。
UPDATE [schema.]table
SET column = value [, ...]
[WHERE condition]
SQL> UPDATE tsuka.emp SET comm = null;
SQL> UPDATE emp SET comm = null;
SQL> UPDATE emp SET comm = null, mgr = null
UPDATEで更新するレコードに条件を指定したい場合は、WHERE句で条件を指定する。更新対象が複数行ある場合は、それらのすべてを更新する。更新対象が無い場合は、何も更新せず、エラーにもならない。
SQL> UPDATE emp SET comm = 0 WHERE comm IS null;
社員表(emp)のすべてのレコードについて、部署番号列(deptno)を更新する。
UPDATE emp SET deptno = 10
自分のスキーマ内以外にあるテーブルを更新するには、スキーマ名も指定する。
UPDATE schema1.emp SET deptno = 10
社員表のすべてのレコードについて、歩合給(comm)と部署番号列を更新する。
UPDATE emp SET comm = NULL, deptno = 10
自分のスキーマ内にある表の行を更新するには、とくに権限は必要ない。
更新するテーブルが自分のスキーマ内にない場合は、更新するテーブルに対する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)に違反しました