首批通过分布式安全可靠测评,为关键业务系统打造
更新数据
更新时间:2026-02-17 12:17:44
插入表数据后,可以使用 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 修改远端数据库中的数据。