説明
このステートメントは、テーブル内のデータを更新するために使用されます。
制限事項と注意点
複数テーブルの更新であっても単一テーブルの更新であっても、サブクエリに対して直接更新値を操作することはサポートされておらず、その場合エラーが報告されます。例:
UPDATE (SELECT * FROM T1) SET C1 = 100;
実行結果は次のとおりです:
ERROR 1288 (HY000): The target table of the UPDATE is not updatable
権限要件
UPDATE ステートメントを実行するには、現在のユーザーが UPDATE 権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類を参照してください。
構文
UPDATE [hint_options] [IGNORE] table_references
SET update_asgn_list
[WHERE where_condition_list]
[ORDER BY order_expression_list]
[LIMIT row_count];
table_references:
table_name [PARTITION (partition_name_list)] [, table_name [PARTITION (partition_name_list)] ...]
partition_name_list:
partition_name [, partition_name ...]
update_asgn_list:
column_name = expr [, column_name = expr ...]
where_condition_list:
where_condition [, where_condition ...]
where_condition:
expression
order_expression_list:
order_expression [, order_expression ...]
order_expression:
expression [ASC | DESC]
パラメータの説明
| パラメータ | 説明 |
|---|---|
| hint_options | オプションで、hintオプションを指定します。Hintの詳細については、Optimizer Hintを参照してください。 |
| IGNORE | オプションで、更新操作中に重複キーが発生した場合、その行の更新操作を無視します。 |
| table_references | 更新対象のテーブル名のリストを指定します。1つまたは複数のテーブルを指定できます。複数のテーブルを更新する場合、テーブル名は英字のカンマ(,)で区切ります。詳細については、以下のtable_referencesを参照してください。 |
| update_asgn_list | 更新する列と対応する新しい値を指定します。 |
| column_name | 列名。 |
| WHERE where_condition_list | オプションで、フィルタ条件のリストを指定します。これにより、どの行が更新されるかを指定します。特定の条件データを更新する詳細については、以下のwhere_conditionを参照してください。 |
| ORDER BY order_expression_list | オプションで、更新する行のソートキーのリストを指定します。通常はLIMIT句と一緒に使用します。更新順序の詳細については、以下のorder_expressionを参照してください。 |
| LIMIT row_count | オプションで、更新する行数を指定します。 |
table_references
table_name:データを更新するテーブル名を指定します。また、PARTITIONキーワードを使用してパーティション単位でのデータ更新も可能です。partition_name_list:データを更新するパーティション名のリストを指定します。複数のパーティションを更新する場合は、パーティション名を英語のカンマ(,)で区切ります。partition_name:データを更新するパーティション名を表します。
例:
テーブル
tbl1を作成します。CREATE TABLE tbl1(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT) PARTITION BY HASH(col1) PARTITIONS 5;テーブル
tbl1にテストデータを挿入します。INSERT INTO tbl1 VALUES (1, 'A1', 1),(2, 'A2', 2),(3, 'A3', 3), (4, 'A4', 4),(5, 'A5', 5),(6, 'A6', 6), (7, 'A7', 7),(8, 'A8', 8),(9, 'A9', 9);テーブル
tbl1のp0およびp1パーティションのデータを確認します。SELECT * FROM tbl1 PARTITION(p0, p1);実行結果は次のとおりです:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 5 | A5 | 5 | | 1 | A1 | 1 | | 6 | A6 | 6 | +------+------+------+ 3 rows in setテーブル
tbl1のp0およびp1パーティションのデータを更新し、col2列の値とアンダースコアと文字列updateを連結した後、col2列の値を連結後の結果に更新します。UPDATE tbl1 PARTITION(p0, p1) SET col2 = CONCAT(col2, '_', 'update');実行結果は次のとおりです:
Query OK, 3 rows affected Rows matched: 3 Changed: 3 Warnings: 0再度、テーブル
tbl1のp0およびp1パーティションのデータを確認します。SELECT * FROM tbl1 PARTITION(p0, p1);実行結果は次のとおりです:
+------+-----------+------+ | col1 | col2 | col3 | +------+-----------+------+ | 5 | A5_update | 5 | | 1 | A1_update | 1 | | 6 | A6_update | 6 | +------+-----------+------+ 3 rows in set
where_condition
expression:更新対象の行をフィルタリングするために使用できる条件式を指定します。
例:
テーブル
tbl1内のcol1 = 2のデータを確認します。SELECT * FROM tbl1 WHERE col1 = 2;実行結果は次のとおりです:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 2 | A2 | 2 | +------+------+------+ 1 row in setテーブル
tbl1内のcol1 = 2の行を更新し、col2の値をupdate A2に、col3の値を 22 に設定します。UPDATE tbl1 SET col2 = 'update A2', col3 = 22 WHERE col1 = 2;実行結果は次のとおりです:
Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0再度テーブル
tbl1内のcol1 = 2のデータを確認します。SELECT * FROM tbl1 WHERE col1 = 2;実行結果は次のとおりです:
+------+-----------+------+ | col1 | col2 | col3 | +------+-----------+------+ | 2 | update A2 | 22 | +------+-----------+------+ 1 row in set
order_expression
expression [ASC | DESC]:昇順(ASC、デフォルト値)または降順(DESC)でソートするための式を指定します。
例:
テーブル
tbl1の列col1の値が5より大きいものを照会し、結果をcol3列の値に基づいて降順(大きい順)でソートします。SELECT * FROM tbl1 WHERE col1 > 5 ORDER BY col3 DESC;実行結果は次のとおりです:
+------+-----------+------+ | col1 | col2 | col3 | +------+-----------+------+ | 9 | A9 | 9 | | 8 | A8 | 8 | | 7 | A7 | 7 | | 6 | A6_update | 6 | +------+-----------+------+ 4 rows in settbl1テーブルに対して更新操作を実行し、条件col1が5より大きい行のcol3列の値に10を乗じ、col3を降順でソートして上位2行を取得して更新します。UPDATE tbl1 SET col3 = col3*10 WHERE col1 > 5 ORDER BY col3 DESC LIMIT 2;実行結果は次のとおりです:
Query OK, 2 rows affected Rows matched: 2 Changed: 2 Warnings: 0再度テーブル
tbl1のデータを照会します。SELECT * FROM tbl1 WHERE col1 > 5 ORDER BY col3 DESC;実行結果は次のとおりです:
+------+-----------+------+ | col1 | col2 | col3 | +------+-----------+------+ | 9 | A9 | 90 | | 8 | A8 | 80 | | 7 | A7 | 7 | | 6 | A6_update | 6 | +------+-----------+------+ 4 rows in set
例
サンプルテーブル
test_tbl1を作成します。CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 INT);テーブル
test_tbl1にテストデータを挿入します。INSERT INTO test_tbl1 VALUES (1, 1),(2, 2),(3, 3), (4, 4),(5, 5);
複数のテーブルを変更します。
tbl1テーブルとtest_tbl1テーブルのうち、tbl1.col1 = test_tbl1.col1に一致する行のデータについて、tbl1テーブルのcol3列の値を100に、test_tbl1テーブルのcol2列の値を200に変更します。UPDATE test_tbl1, tbl1 SET tbl1.col3 = 100, test_tbl1.col2 = 200 WHERE tbl1.col1 = test_tbl1.col1;実行結果は次のとおりです:
Query OK, 10 rows affected Rows matched: 10 Changed: 10 Warnings: 0テーブル
test_tbl1のデータを確認します。SELECT * FROM test_tbl1;実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 200 | | 2 | 200 | | 3 | 200 | | 4 | 200 | | 5 | 200 | +------+------+ 5 rows in set
IGNOREキーワードを使用してテストテーブルtest_tbl1内のデータを更新します。更新中に重複キーが発生した場合、その行の更新操作は無視されます。test_tbl1テーブルに対して更新操作を実行し、条件col1が3より大きい行のcol1値を1増やします。UPDATE IGNORE test_tbl1 SET col1 = col1 + 1 WHERE col1 > 3;実行結果は次のとおりです:
Query OK, 1 row affected Rows matched: 2 Changed: 1 Warnings: 0テーブル
test_tbl1のデータを確認します。SELECT * FROM test_tbl1;実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 200 | | 2 | 200 | | 3 | 200 | | 4 | 200 | | 6 | 200 | +------+------+ 5 rows in set
更新可能なビューに対して値を更新します。
ビュー
v1を作成します。CREATE VIEW v1 AS SELECT * FROM test_tbl1;v1内で条件v1.col1 = 1に一致する行を更新し、v1.col2の値を100に設定します。UPDATE v1 SET v1.col2 = 100 WHERE v1.col1 = 1;実行結果は次のとおりです:
Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0テーブル
v1のデータを確認します。SELECT * FROM v1;実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 100 | | 2 | 200 | | 3 | 200 | | 4 | 200 | | 6 | 200 | +------+------+ 5 rows in set
パーティションキーの値を更新します。
テーブル
test_tbl2を作成します。obclient> CREATE TABLE test_tbl2(col1 INT, col2 INT, PRIMARY KEY(col1, col2)) PARTITION BY HASH(col2) PARTITIONS 4;テーブル
test_tbl2にテストデータを挿入します。obclient> INSERT INTO test_tbl2 VALUES (1, 1), (2, 2), (3, 3), (4, 4), (5, 5);テーブル
test_tbl2内のcol1 = 4の行のcol2の値を55に更新します。obclient> UPDATE test_tbl2 SET col2 = 55 WHERE col1 = 4;