テーブルにデータを挿入した後、UPDATE ステートメントやその他のステートメントを使用して、テーブルの行レコードを更新することができます。本記事では、関連するステートメントの使い方と例を紹介します。
データ更新の準備
テーブルデータを更新する前に、以下の点を確認してください:
データベースのMySQLテナントに接続していることを確認してください。データベースへの接続操作については、接続方法の概要を参照してください。
説明
現在ログインしているテナントが属するテナントモードは、
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 ] | いいえ | 条件句は、更新される行が満たす必要がある条件を指定します。この句を省略した場合、更新対象のテーブルの該当列すべてのレコードを更新することを意味します。 |
すべてのレコードを更新する
t_insert テーブルの value 列のすべての値を更新し、すべての値に1を加算します。例:
obclient [test]> UPDATE t_insert SET value = value+1;
Query OK, 4 rows affected
Rows matched: 4 Changed: 4 Warnings: 0
obclient [test]> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10002 | 1970-01-01 17:18:06 |
| 2 | US | 10003 | 1970-01-01 17:18:47 |
| 3 | EN | 10004 | 1970-01-01 17:18:47 |
| 4 | JP | 10005 | 1970-01-01 17:28:21 |
+----+------+-------+---------------------+
4 rows in set
UPDATE ステートメントを実行する際は、トランザクションのサイズが大きくなりすぎないように注意する必要があります。LIMIT キーワードを使用して数量を制限するか WHERE キーワードを使用して更新範囲を限定することができます。これは条件なしでデータを更新する場合、レコード数が数十万または数百万に達すると、大規模なトランザクションが発生し、実行が失敗する可能性があるためです。
一部のレコードを更新する
テーブルデータを更新する際には、一部のレコードのみを更新することもできます。t_insert テーブル内のレコード数が大きいと仮定した場合、LIMIT キーワードを追加して数量を制御するか、WHERE キーワードを追加して範囲を制御します。
例:
LIMITを使用してt_insertテーブル内の最初の100000行のデータのvalue列の値をvalue+1に更新します。obclient [test]> UPDATE t_insert SET value = value+1 LIMIT 100000;whereを使用してt_insertテーブル内のvalue値が10005のすべての列の値をvalue+1に更新します。obclient [test]> UPDATE t_insert SET value = value+1 where value = 10005;t_insertテーブルのid = 3の行がnameの列の値をUKに更新します。obclient [test]> SELECT * FROM t_insert; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | 10002 | 1970-01-01 17:18:06 | | 2 | US | 10003 | 1970-01-01 17:18:47 | | 3 | EN | 10004 | 1970-01-01 17:18:47 | | 4 | JP | 10005 | 1970-01-01 17:28:21 | +----+------+-------+---------------------+ 4 rows in set obclient [test]> UPDATE t_insert SET name = 'UK' WHERE id = 3; Query OK, 0 rows affected obclient [test]> SELECT * FROM t_insert; +----+------+-------+---------------------+ | id | name | value | gmt_create | +----+------+-------+---------------------+ | 1 | CN | 10002 | 1970-01-01 17:18:06 | | 2 | US | 10003 | 1970-01-01 17:18:47 | | 3 | UK | 10004 | 1970-01-01 17:18:47 | | 4 | JP | 10005 | 1970-01-01 17:28:21 | +----+------+-------+---------------------+ 4 rows in set
レコード更新時の一意性制約違反
テーブルに一意性制約が設定されている場合、同じレコードに更新しようとすると、システムはエラーを返し、データの更新は失敗します。エラーの例は以下のとおりです。
obclient [test]> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10002 | 1970-01-01 17:18:06 |
| 2 | US | 10003 | 1970-01-01 17:18:47 |
| 3 | EN | 10004 | 1970-01-01 17:18:47 |
| 4 | JP | 10005 | 1970-01-01 17:28:21 |
+----+------+-------+---------------------+
4 rows in set
obclient [test]> CREATE UNIQUE INDEX uk_name ON t_insert(name);
Query OK, 0 rows affected
obclient [test]> UPDATE t_insert SET name = 'US' where id = 3;
ERROR 1062 (23000): Duplicate entry 'US' for key 'uk_name'
他のステートメントを使用したデータの更新
明示的な UPDATE ステートメント以外の他のステートメントを使用してデータを更新することができます。例えば、INSERT ステートメントを使用してデータを挿入する場合、制約の競合により、ON DUPLICATE KEY UPDATE 句を使用して挿入データを更新データステートメントに変換することで、関連するフィールドを更新することができます。
ON DUPLICATE KEY UPDATE 句を使用して、挿入データを更新データに変換することができます。例:
obclient [test]> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-10-12 15:17:17 |
| 2 | US | 10002 | 2022-10-12 16:29:16 |
| 3 | EN | 10003 | 2022-10-12 16:29:26 |
| 4 | JP | 10004 | 2022-10-12 17:02:52 |
+----+------+-------+---------------------+
4 rows in set
obclient [test]> INSERT INTO t_insert(id, name, value) VALUES (3,'UK', 10003),(5, 'CN', 10005) ON DUPLICATE KEY UPDATE name = VALUES(name);
Query OK, 1 row affected
obclient [test]> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-10-12 16:29:16 |
| 2 | US | 10002 | 2022-10-12 15:17:17 |
| 3 | UK | 10003 | 2022-10-12 16:29:26 |
| 4 | JP | 10004 | 2022-10-12 17:02:52 |
| 5 | CN | 10005 | 2022-10-12 17:27:46 |
+----+------+-------+---------------------+
5 rows in set
例中の ON DUPLICATE KEY UPDATE name = VALUES(name) は、挿入するデータがテーブルの主キー値と重複する場合、テーブル内で衝突した行(元のデータは (3,'EN', 10003))の name 列の値を、現在挿入しようとしている name 列の値に更新することを意味します。