説明
このステートメントは、テーブル内の既存のフィールド値を変更するために使用します。
構文
UPDATE [hint_options] dml_table_clause
SET update_asgn_list
[ WHERE where_condition]
[{ RETURNING | RETURN } returning_exprs [into_clause]]
dml_table_clause:
dml_table_name opt_table_alias
update_asgn_list:
column_name = expr [, expr...]
where_condition:
expression
returning_exprs:
projection_col_name [,projection_col_name ...]
into_clause:
{ INTO into_var_list | BULK COLLECT INTO into_var_list}
into_var_list:
{ USER_VARIABLE | ref_name } [,{ USER_VARIABLE | ref_name } ...]
パラメータの説明
パラメータ |
説明 |
|---|---|
| hint_options | Hintオプションを指定します。 |
| dml_table_clause | 更新対象のテーブル、ビュー、または特殊サブクエリが返す列名を指定します。 説明 viewを指定した場合、データベースはビューのベーステーブルを更新します。ただし、1つのビューで複数のベーステーブルを更新することはできません。 |
| where_condition | 絞り込み条件を指定します。 |
| update_asgn_list | 更新リストを指定します。 |
| returning_exprs | 変更後のデータを投影した列を返します。 |
| into_clause | 変更後のデータを投影した列を指定されたリストに挿入します。 |
| into_var_list | 指定された投影列を指定された変数リストに挿入します。 |
| ref_name | 変数名。 |
注意
特殊サブクエリとは、更新可能なビューに対応するサブクエリのようなものを指します。この種のサブクエリには、複雑な演算子(例:GROUP BY、DISTINCT、WINDOW FUNCTIONなど)を含めないでください。
例1
サンプルテーブル tbl1 を作成し、テストデータを挿入します。
obclient> CREATE TABLE tbl1(col1 INT PRIMARY KEY,col2 INT);
Query OK, 0 rows affected
obclient> INSERT INTO tbl1 VALUES(1,1),(2,2),(3,3),(4,4),(5,5);
Query OK, 5 rows affected
Records: 5 Duplicates: 0 Warnings: 0
obclient> SELECT * FROM tbl1;
+------+------+
| COL1 | COL2 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+------+------+
5 rows in set
単一テーブルの更新:テーブル
tbl1のtbl1.col1=1に対応する行のcol2列の値を100に変更します。obclient> UPDATE tbl1 SET tbl1.col2 = 100 WHERE tbl1.col1 = 1; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT * FROM tbl1; +------+------+ | COL1 | COL2 | +------+------+ | 1 | 100 | | 2 | 2 | | 3 | 3 | | 4 | 4 | | 5 | 5 | +------+------+ 5 rows in set単一テーブルの更新:サブクエリを直接操作し、サブクエリ内の
v.col1=1に対応する行のcol2列の値を10に変更します。obclient> UPDATE (SELECT * FROM tbl1) v SET v.col2 = 10 WHERE v.col1 = 1; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT * FROM tbl1; +------+------+ | COL1 | COL2 | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | | 4 | 4 | | 5 | 5 | +------+------+ 5 rows in set単一テーブルの更新:テーブル
tbl1のtbl1.col1<3に対応する行のcol2列の値を100に変更します。obclient> UPDATE tbl1 SET tbl1.col2 = 100 WHERE tbl1.col1 < 3; Query OK, 2 rows affected Rows matched: 2 Changed: 2 Warnings: 0 obclient> SELECT * FROM tbl1; +------+------+ | COL1 | COL2 | +------+------+ | 1 | 100 | | 2 | 100 | | 3 | 3 | | 4 | 4 | | 5 | 5 | +------+------+ 5 rows in set単一テーブルの更新:
RETURNING句で更新後のデータを返します。obclient> UPDATE tbl1 SET tbl1.col2 = 1000 WHERE tbl1.col1 = 1 RETURNING col2; +------+ | COL2 | +------+ | 1000 | +------+ 1 row in set obclient> SELECT * FROM tbl1; +------+------+ | COL1 | COL2 | +------+------+ | 1 | 1000 | | 2 | 2 | | 3 | 3 | | 4 | 4 | | 5 | 5 | +------+------+ 5 rows in set
例2
サンプルテーブルを作成します。
obclient> CREATE TABLE employees1 ( id NUMBER, name VARCHAR2(20), salary NUMBER );obclient> CREATE TABLE employees2 ( id NUMBER, name VARCHAR2(20), salary NUMBER );テストデータを挿入します。
obclient> INSERT INTO employees1 VALUES (1, 'Jack', 5000); obclient> INSERT INTO employees2 VALUES (1, 'Tom', 3000);変数を使用してテーブルの更新操作を行います。
-- 変数の宣言 DECLARE var_emp employees1%ROWTYPE; BEGIN -- employees1のデータを変数に取得する SELECT * INTO var_emp FROM employees1 WHERE id = 1; -- 変数を使用してemployees2テーブルを更新する UPDATE employees2 SET (name) = (var_emp.name); COMMIT; END; /