
# UPDATE
#### 功能描述
更新表中的数据。UPDATE修改满足条件的所有行中指定的字段值，WHERE子句声明条件，SET子句指定的字段会被修改，没有出现的字段则保持它们的原值。
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/note_3.0-zh-cn.png)
目前仅Iceberg表支持Update。
#### 注意事项
- 要修改表中的数据，用户必须对它有UPDATE权限。同样对expression或condition条件里涉及到的任何表要有SELECT权限。
- 试图在一个SQL语句中用多行数据更新同一行时会报错。
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/warning_3.0-zh-cn.png)
避免UPDATE并发更新同一分区的数据。
#### 语法格式
```
UPDATE [/*+ plan_hint */] [ ONLY ] table_name [ * ] [ [ AS ] alias ]
 SET {column_name = { expression | DEFAULT } 
    |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...]
    [ FROM from_list] [ WHERE condition ];
where sub_query can be:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
{ * | {expression [ [ AS ] output_name ]} [, ...] }
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition [, ...] ]
```
#### 参数说明
- plan_hint子句：以/\*+ \*/的形式在关键字后，用于对指定语句块生成的计划进行hint调优，详细用法请参见[使用Plan Hint进行调优](https://support.huaweicloud.com/devg-fabric/dataartsfabric_sql_04_0097.html)。
- table_name：要更新的表名，可以使用模式修饰。
- alias：目标表的别名。
- column_name：要修改的字段名。
  - 支持使用目标表的表名加字段名来引用这个字段。例如：
    ```
    UPDATE foo SET foo.col_name = 'a'
    ```
    
  
  - 支持使用目标表的别名加字段名来引用这个字段。例如：
    ```
    UPDATE foo AS f SET f.col_name = 'a'
    ```
    
   
- expression：赋给字段的值或表达式。
- DEFAULT：用对应字段的缺省值填充该字段。如果没有缺省值，则为NULL。
- sub_query：子查询。使用同一数据库里其他表的信息来更新一个表可以使用子查询的方法。其中SELECT子句具体介绍请参考[SELECT](https://support.huaweicloud.com/devg-fabric/dataartsfabric_sql_04_0308.html)。
- from_list：一个表的表达式列表，允许在WHERE条件里使用其他表的字段。与在一个SELECT语句的FROM子句里声明表列表类似。 **注意**：目标表绝对不能出现在from_list里，除非在使用一个自连接（此时它必须以from_list的别名出现）。
  
- condition：一个返回boolean类型结果的表达式。只有这个表达式返回true的行才会被更新。
 
#### 示例
创建表reason_update：
```
CREATE TABLE reason_update
(
    TABLE_SK          INTEGER               ,
    TABLE_ID          VARCHAR(20)           ,
    TABLE_NA          VARCHAR(20)
) store as iceberg;
```
向表reason_update中插入数据：
```
INSERT INTO reason_update VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB');
```
对表reason_update执行UPDATE操作：
```
UPDATE reason_update SET TABLE_NA = 'TeacherD' where TABLE_SK = 3;
```
