首批通过分布式安全可靠测评,为关键业务系统打造
UPDATE
更新时间:2026-04-10 11:58:35
描述
该语句用于修改表中的字段值。
语法
UPDATE [IGNORE] table_references
SET update_asgn_list
[WHERE where_condition]
[ORDER BY order_list]
[LIMIT row_count];
table_references:
table_name [PARTITION (partition_name,...)] [, ...]
update_asgn_list:
column_name = expr [, ...]
order_list:
column_name [ASC|DESC] [, column_name [ASC|DESC]...]
参数解释
| 参数 | 描述 |
|---|---|
| IGNORE | 在 INSERT 语句执行过程中发生的错误将会被忽略。 |
| table_references | 指定修改表名,多表修改时,表名以逗号(,)分隔。 |
| where_condition | 指定过滤条件。 |
| row_count | 限制的行数。 |
| table_name | 插入表名。 |
| partition_name | 插入表指定的分区名。 |
| column_name | 列名。 |
| ASC | 按列名升序修改。 |
| DESC | 按列名降序修改。 |
说明
不管是多表还是单表更新都不支持直接对子查询进行更新值操作,否则会报错。示例如下:
obclient> UPDATE (SELECT * FROM T1) SET C1 = 100;
ERROR 1288 (HY000): The target table of the UPDATE is not updatable
示例
创建示例表
t1和t2。obclient> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT); Query OK, 0 rows affected obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 4 | +----+------+ 4 rows in set obclient> CREATE TABLE t2(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4; Query OK, 0 rows affected obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | | 1 | 1 | | 2 | 2 | | 3 | 3 | +----+------+ 4 rows in set将表
t1中t1.c1=1对应的那一行数据的c2列值修改为100。obclient> UPDATE t1 SET t1.c2 = 100 WHERE t1.c1 = 1; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 100 | | 2 | 2 | | 3 | 3 | | 4 | 4 | +----+------+ 4 rows in set将表
t1中按照c2列排序的前两行数据的c2列值修改为100。obclient> UPDATE t1 SET t1.c2 = 100 ORDER BY c2 LIMIT 2; Query OK, 2 rows affected Rows matched: 2 Changed: 2 Warnings: 0 obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 100 | | 2 | 100 | | 3 | 3 | | 4 | 4 | +----+------+ 4 rows in set将表
t2中p2分区的数据中t2.c1 > 2的对应行数据的c2列值修改为100。obclient> UPDATE t2 PARTITION(p2) SET t2.c2 = 100 WHERE t2.c1 > 2; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | | 1 | 1 | | 2 | 2 | | 3 | 100 | +----+------+ 4 rows in set修改多个表,将
t1表和t2表中满足t1.c1 = t2.c1对应行的数据t1表中的c2列值修改为100,t2表中的c2列值修改为200。obclient> UPDATE t1,t2 SET t1.c2 = 100, t2.c2 = 200 WHERE t1.c2 = t2.c2; Query OK, 6 rows affected Rows matched: 6 Changed: 6 Warnings: 0 obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 100 | | 2 | 100 | | 3 | 100 | | 4 | 4 | +----+------+ 4 rows in set obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | | 1 | 200 | | 2 | 200 | | 3 | 200 | +----+------+ 4 rows in set修改多个表。修改
t1表和t2表的p2分区中满足t1.c1 = t2.c1对应行的数据t1表中的c2列值修改为100,t2表中的c2列值修改为200。obclient> UPDATE t1,t2 PARTITION(p2) SET t1.c2 = 100, t2.c2 = 200 WHERE t1.c2 = t2.c2; Query OK, 6 rows affected Rows matched: 6 Changed: 6 Warnings: 0 obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 100 | | 2 | 100 | | 3 | 100 | | 4 | 4 | +----+------+ 4 rows in set obclient> SELECT * FROM t2; +----+------+ | c1 | c2 | +----+------+ | 5 | 5 | | 1 | 200 | | 2 | 200 | | 3 | 200 | +----+------+ 4 rows in set对可更新视图
v进行更新值。obclient> CREATE VIEW v AS SELECT * FROM t1; Query OK, 0 rows affected obclient> UPDATE v SET v.c2 = 100 WHERE v.c1 = 1; Query OK, 1 row affected Rows matched: 1 Changed: 1 Warnings: 0 obclient> SELECT * FROM v; +----+------+ | c1 | c2 | +----+------+ | 1 | 100 | | 2 | 2 | | 3 | 3 | | 4 | 4 | +----+------+ 4 rows in set