UPDATE テーブルの行を更新するSQL文

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

構文

UPDATE table SET column = value
UPDATE schema.table SET column = value
UPDATE table SET column = value WHERE condition
UPDATE schema.table SET column = value WHERE condition
table
更新するテーブル(表)名を指定する。
UPDATE emp SET comm = null
schema
更新するテーブルが存在するスキーマ名を指定する。更新するテーブルが自分のスキーマ内にある場合は、スキーマ名の指定を省略できる。
UPDATE company.emp SET comm = null
column
カラム(列)名を指定する。
UPDATE emp SET comm = null, mgr = null
value
更新する値を指定する。
condition
更新するレコード(行)の条件を指定する。

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

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);

関連SQL

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