更新数据
插入表数据后,可以使用 UPDATE 语句或其他语句来更新表的行记录。本文介绍了相关语句的使用方法和示例。
数据更新准备
在更新表数据前,请确认以下事项:
-
请确认您已连接到 seekdb,连接数据库的操作请参见 连接方式概述。
-
请确认您已拥有待操作的表的
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。示例如下:
UPDATE t_insert SET value = value+1;
Query OK, 5 rows affected (0.007 sec)
Rows matched: 5 Changed: 5 Warnings: 0
SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10002 | 2025-12-23 11:12:23 |
| 2 | US | 10003 | 2025-12-23 11:12:24 |
| 3 | EN | 10004 | 2025-12-23 11:12:27 |
| 4 | JP | 10005 | 2025-12-23 11:12:45 |
+----+------+-------+---------------------+
4 rows in set
执行 UPDATE 语句时要注意控制事务不要太大,您可以通过 LIMIT 关键字来控制数量或者通过 WHERE 关键字来控制范围。这是因为不带条件更新数据时,如果记录数达到几十万或者几百万,会有大事务产生,可能会导致执行失败。
更新部分记录
在更新表数据时,也可以只更新部分记录。假设 t_insert 表中的记录数较大,下面通过添加 LIMIT 关键字来控制数量或者通过添加 WHERE 关键字来控制范围。
示例:
-
通过
LIMIT在t_insert表中,更新前 100000 行数据value列的值为value+1。UPDATE t_insert SET value = value+1 LIMIT 100000; -
通过
where在t_insert表中,对value值为10005的所有列,将其值更新为value+1。UPDATE t_insert SET value = value+1 where value = 10005; -
t_insert表中 更新id = 3所在行的name列的值为UK。SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10003 | 2025-12-23 11:12:23 |
| 2 | US | 10004 | 2025-12-23 11:12:24 |
| 3 | EN | 10006 | 2025-12-23 11:12:27 |
| 4 | JP | 10006 | 2025-12-23 11:12:45 |
+----+------+-------+---------------------+
4 rows in set
UPDATE t_insert SET name = 'UK' WHERE id = 3;
Query OK, 0 rows affected
SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10003 | 2025-12-23 11:12:23 |
| 2 | US | 10004 | 2025-12-23 11:12:24 |
| 3 | UK | 10006 | 2025-12-23 11:12:27 |
| 4 | JP | 10006 | 2025-12-23 11:12:45 |
+----+------+-------+---------------------+
4 rows in set
更 新记录唯一性约束冲突
当表上有唯一性约束时,更新为相同的记录,系统会报错,数据更新失败,报错示例如下。
SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10003 | 2025-12-23 11:12:23 |
| 2 | US | 10004 | 2025-12-23 11:12:24 |
| 3 | UK | 10006 | 2025-12-23 11:12:27 |
| 4 | JP | 10006 | 2025-12-23 11:12:45 |
+----+------+-------+---------------------+
4 rows in set
CREATE UNIQUE INDEX uk_name ON t_insert(name);
Query OK, 0 rows affected
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 子句将插入数据转变为更新数据,示例如下:
SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10003 | 2025-12-23 11:12:23 |
| 2 | US | 10004 | 2025-12-23 11:12:24 |
| 3 | UK | 10006 | 2025-12-23 11:12:27 |
| 4 | JP | 10006 | 2025-12-23 11:12:45 |
+----+------+-------+---------------------+
4 rows in set
INSERT INTO t_insert(id, name, value) VALUES (3,'EN', 10003),(5, 'CN', 10005) ON DUPLICATE KEY UPDATE name = VALUES(name);
Query OK, 1 row affected
SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10003 | 2025-12-23 11:12:23 |
| 2 | US | 10004 | 2025-12-23 11:12:24 |
| 3 | EN | 10006 | 2025-12-23 11:12:27 |
| 4 | JP | 10006 | 2025-12-23 11:12:45 |
+----+------+-------+---------------------+
4 rows in set
示例中,ON DUPLICATE KEY UPDATE name = VALUES(name) 即表示当插入的数据与表中的主键值有重复时,将表中冲突行原数据中 (3,'EN', 10003) 的 name 列的值更新为当前待插入的 name 列的值。