
# 更新表中数据
修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行。还可以独立更新每个字段，而其他字段则不受影响。
使用UPDATE命令更新现有行，需要提供以下三种信息：
- 表的名称和要更新的字段名
- 字段的新值
- 要更新哪些行
SQL通常不会为数据行提供唯一标识，因此无法直接声明需要更新哪一行。但是可以通过声明一个被更新的行必须满足的条件。只有在表里存在主键的时候，才可以通过主键指定一个独立的行。
建立表和插入数据的步骤请参考[创建表](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/gaussdb_42_0028.html#ZH-CN_TOPIC_0000002186175358)和[向表中插入数据](https://support.huaweicloud.com/centralized-devg-v2-gaussdb/gaussdb_42_0029.html#ZH-CN_TOPIC_0000002221495837)。
需要将表customer_t1中c_customer_sk为9527的地域重新定义为9876：
```
openGauss=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527;
```
这里的表名称也可以使用模式名修饰，否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值。新的字段值不仅可以是常量，也可以是变量表达式。
比如，把所有c_customer_sk的值增加100：
```
openGauss=# UPDATE customer_t1 SET c_customer_sk = c_customer_sk + 100;
```
在这里省略了WHERE子句，表示表中的所有行都要被更新。如果出现了WHERE子句，那么只有匹配其条件的行才会被更新。
在SET子句中的等号是一个赋值，而在WHERE子句中的等号是比较。WHERE条件不一定是相等测试，许多其他的操作符也可以使用。
用户可以在一个UPDATE命令中更新更多的字段，方法是在SET子句中列出更多赋值，比如：
```
openGauss=# UPDATE customer_t1 SET  c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;
```
批量更新或删除数据后，会在数据文件中产生大量的删除标记，查询过程中标记删除的数据也是需要扫描的。故多次批量更新/删除后，标记删除的数据量过大会严重影响查询的性能。建议在批量更新/删除业务会反复执行的场景下，定期执行VACUUM FULL以保持查询性能。
