テーブルにデータを挿入した後、UPDATE ステートメントを使用してテーブルの行レコードを更新できます。本記事では、関連するステートメントの使い方と例を紹介します。
データ更新の準備
テーブルデータを更新する前に、以下の点を確認してください:
データベースのOracleテナントに接続されていることを確認してください。データベースへの接続操作については、接続方法の概要を参照してください。
説明
現在ログインしているテナントが属するテナントモードは、
sysテナントでoceanbase.DBA_OB_TENANTSビューをクエリすることで確認できます。操作対象のテーブルの
UPDATE権限を持っていることを確認してください。現在のユーザー権限を確認する操作の詳細については、ユーザー権限の確認を参照してください。この権限を持っていない場合は、管理者に連絡し権限の付与を依頼してください。ユーザー権限に関する操作については、直接権限付与を参照してください。
UPDATEステートメントを使用してデータを更新する
通常、テーブルデータを更新するには、UPDATE ステートメントを使用します。
UPDATE ステートメントの構文は以下のとおりです:
UPDATE table_name
SET column_name = value [, column_name = value]...
[ WHERE condition ];
| パラメータ | 必須 | 説明 |
|---|---|---|
| table_name | はい | 更新対象となるテーブルを指定します |
| column_name = value [, column_name = value] | はい | 更新対象の列を指定します。等号(=)の後ろの value は更新後の値です。 |
| [ WHERE condition ] | いいえ | 条件句は、更新される行が満たす必要がある条件を指定します。この句を省略した場合、更新対象のテーブルの該当列すべてのレコードを更新することを意味します。 |
一部のレコードを更新する
テーブルデータを更新する際には、一部のレコードのみを更新することができます。
例4:t_insert テーブルの id = 3 の行の name 列の値を UK に更新します。
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10002 | 31-OCT-22 |
| 2 | US | 10004 | 31-OCT-22 |
| 3 | EN | 10004 | 01-NOV-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> UPDATE t_insert SET name = 'UK' WHERE id = 3;
Query OK, 1 rows affected
Rows matched: 1 Changed: 1 Warnings: 0
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10002 | 31-OCT-22 |
| 2 | US | 10004 | 31-OCT-22 |
| 3 | UK | 10004 | 01-NOV-22 |
+----+------+-------+------------+
3 rows in set
しかし、テーブルに一意性制約がある場合、同じレコードに更新しようとすると、システムはエラーを返し、データの更新は失敗します。エラーの例は以下のとおりです。
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10002 | 31-OCT-22 |
| 2 | US | 10004 | 31-OCT-22 |
| 3 | UK | 10004 | 01-NOV-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> CREATE UNIQUE INDEX uk_name ON t_insert(name);
Query OK, 0 rows affected
obclient [SYS]> UPDATE t_insert SET name = 'US' where id = 3;
OBE-00001: unique constraint 'US' for key 'UK_NAME' violated
すべてのレコードを更新する
例1:t_insert テーブルの value 列のすべての値を 1 加算して更新します。
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 31-OCT-22 |
| 2 | US | 10002 | 31-OCT-22 |
| 3 | EN | 10003 | 01-NOV-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> UPDATE t_insert SET value = value+1;
Query OK, 3 rows affected
Rows matched: 3 Changed: 3 Warnings: 0
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10002 | 31-OCT-22 |
| 2 | US | 10003 | 31-OCT-22 |
| 3 | EN | 10004 | 01-NOV-22 |
+----+------+-------+------------+
3 rows in set
UPDATE ステートメントを実行する際は、トランザクションのサイズが大きくなりすぎないように注意してください。WHERE キーワードを使用して更新範囲を限定することができます。これは条件なしでデータを更新する場合、レコード数が数十万または数百万に達すると、大規模なトランザクションが発生し、実行が失敗する可能性があるためです。
例2:t_insert テーブルにおいて、value が 10003 であるすべての行の値を value+1 に更新します。
obclient [SYS]> UPDATE t_insert SET value = value+1 WHERE value = 10003;
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
DBLinkを使用したUPDATEステートメントによるデータの更新
現在、OceanBaseデータベースは、DBLinkを通じてOceanBaseデータベース(Oracleモード)およびOracleデータベースへのデータ更新をサポートしています。
DBLinkを使用して、リモートデータベースのテーブル t2 の C1 列の値を 3 に変更する例は以下のとおりです:
obclient> SET ob_trx_timeout = 1000000000;
Query OK, 0 rows affected
obclient> SELECT * FROM t2@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 2 | 2 |
+------+------+
1 row in set
obclient> UPDATE t2@ob_dblink SET C1 = 3;
Query OK, 1 row affected
obclient> commit;
Query OK, 0 rows affected
obclient> SELECT * FROM t2@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 3 | 2 |
+------+------+
1 rows in set
OceanBaseデータベースのOracleモードは、ローカルテーブルデータを(INSERT、DELETE、UPDATE、および MERGE INTO)リモートテーブルに書き込むことをサポートしています。詳細については、DBLinkを使用してリモートデータベースのデータを変更するを参照してください。