云服务器内容精选

  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。这种子查询语句结构称为CTE(Common Table Expression)结构,应用这种结构时,执行计划中将存在CTE SCAN的内容。 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 其中with_query的详细格式为: with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( {select | values | insert | update | delete} )。 with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 column_name指定子查询结果集中显示的列名。 每个子查询可以是SELECT、VALUES、INSERT、UPDATE或DELETE语句。 用户可以使用MATERIALIZED或NOT MATERIALIZED对CTE进行修饰。 如果声明为MATERIALIZED,WITH查询将被物化,生成一个子查询结果集的复制,在引用处直接查询该复制,因此WITH子查询无法和主干SELECT语句进行联合优化(如谓词下推、等价类传递等),对于此类场景可以使用NOT MATERIALIZED进行修饰,如果WITH查询语义上可以作为子查询内联执行,则可以进行上述优化。 如果用户没有显示声明物化属性则遵守以下规则:如果CTE只在所属SELECT主干中被引用一次,且语义上支持内联执行,则会被改写为子查询内联执行,否则以CTE Scan的方式物化执行。 plan_hint 以/*+ */的形式在UPDATE关键字后,用于对UPDATE对应的语句块生成的计划进行hint调优,详细用法请参见章节使用Plan Hint进行调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。 table_name 要更新的表名,可以使用模式修饰。如果在表名前指定了ONLY,只会更新表中匹配的行。如果未指定,任何从该表继承到的表中的匹配行也会被更新。 取值范围:已存在的表名称。 支持使用DATABASE LINK方式对远端表进行操作,使用方式详情请参见DATABASE LINK。 subquery 要更新的子查询,在对子查询进行更新时,会将子查询当成一个临时视图,支持在子查询后面加CHECK OPTION选项。 [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [/*+ plan_hint */] [ ALL ] { * | {expression [ [ AS ] output_name ]} [, ...] } [ into_option ] [ FROM from_item [, ...] ] [ WHERE condition ] [ [ START WITH condition ] CONNECT BY [NOCYCLE] condition [ ORDER SIBLINGS BY expression ] ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ into_option ]; 其中指定子查询源from_item为: {[ ONLY ] {table_name | view_name} [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |( select ) [ AS ] alias [ ( column_alias [, ...] ) ] |with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]} 如果子查询中只有一张表,则对该表更新数据;如果子查询中有多张表或有嵌套关系,则通过判断是否有保留键表确定是否可更新。关于保留键表和WITH CHECK OPTION请参见CREATE VIEW。 view_name 要更新的目标视图。 对视图和子查询的更新,有如下约束: 只有直接引用基表用户列的列可进行UPDATE操作。 子查询或视图必须至少包含一个可更新列,关于可更新列请参见CREATE VIEW。 不支持在顶层包含DISTINCT、GROUP BY、HAVING、LIMIT、OFFSET子句的视图和子查询。 不支持在顶层包含集合运算(UNION、INTERSECT、EXCEPT、MINUS)的视图和子查询。 不支持目标列表中包含聚集函数、窗口函数、返回集合函数(array_agg、json_agg、generate_series等)的视图和子查询。 不支持仅带有BEFORE/AFTER触发器,没有INSTEAD OF触发器或INSTEAD规则的视图。 视图和子查询中支持的表类型包括普通表、临时表、全局临时表、分区表、二级分区表、ustore表、astore表。 多表连接视图或连接子查询中一次只能更新一张基表。 连接视图或子查询只能更新保留键表,如果指定了CHECK OPTION选项,则无法对连接列做更新操作。关于保留键表请参见CREATE VIEW。 不支持更新系统视图。 partition_clause 指定分区更新操作 PARTITION { ( { partition_name | subpartition_name } [, ...] ) | FOR ( partition_value [, ...] ) } | SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } 关键字请参见SELECT。 示例请参见CREATE TABLE SUBPARTITION。 PARTITION指定多个分区名时,一级分区名和二级分区名可同时存在,且可以存在相同的分区名,最终分区范围取其并集。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 table_list 一个表的表达式列表,与from_list类似,但可以同时声明目标表和关联表,仅在多表更新语法中使用,table_list的item可以是subquery。 column_name 要修改的字段名。 支持使用目标表的别名加字段名来引用这个字段。例如:UPDATE foo AS f SET f.col_name = 'namecol'。 取值范围:已存在的字段名。 expression 赋给字段的值或表达式。 DEFAULT 用对应字段的缺省值填充该字段。 如果没有缺省值,则为NULL。 sub_query 子查询。 使用同一数据库里其他表的信息来更新一个表可以使用子查询的方法。其中SELECT子句具体介绍请参考SELECT。 在update单列时,支持使用order by子句与limit子句;而在update多列时,则不支持使用order by子句与limit子句。 from_list 一个表的表达式列表,允许在WHERE条件里使用其他表的字段。与在一个SELECT语句的FROM子句里声明表列表类似。 目标表不能出现在from_list里,除非在使用一个自连接(此时它必须以from_list的别名出现)。 condition 一个返回Boolean类型结果的表达式。只有这个表达式返回true的行才会被更新。不建议使用int等数值类型作为condition,因为int等数值类型可以隐式转换为Boolean值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。 WHERE CURRENT OF cursor_name 当cursor指向表的某一行时,可以使用此语法更新cursor当前指向的行。 cursor_name:指定游标的名称。 B兼容模式的数据库不支持使用此语法。 此语法仅支持普通表,不支持分区表。 仅支持在存储过程中使用。 不支持与其他WHERE条件组合使用。 不支持多表更新。 不支持与WITH、USING、ORDER BY、FROM组合使用。 CURSOR对应的SELECT语句必须声明为FOR UPDATE。 CURSOR对应的SELECT语句仅支持单表,不支持LIMIT/OFFSET,不支持带有子查询、子链接。 存储过程中声明为FOR UPDATE的CURSOR,在COMMIT/ROLLBACK后,将无法再次使用。 若cursor指向的行已经不存在,在A兼容性模式下将报错指定的行不存在(仅UPDATE时报错,DELETE不报错),其他兼容模式下不报错。 ORDER BY 关键字详见SELECT章节介绍。 LIMIT 关键字详见SELECT章节介绍。 RETURNING output_expression 在所有需要更新的行都被更新之后,UPDATE命令用于计算返回值的表达式。 取值范围:使用任何TABLE以及FROM中列出的表的字段。*表示返回所有字段。 output_name 字段的返回名称。
  • 语法格式 单表更新: [ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [/*+ plan_hint */] [ ONLY ] {table_name [ partition_clause ] | subquery | view_name} [ * ] [ [ AS ] alias ] SET {column_name = { expression | DEFAULT } |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...] [ FROM from_list] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] [ LIMIT { count } ] [ RETURNING {* | {output_expression [ [ AS ] output_name ]} [, ...] }]; 多表更新: [ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [/*+ plan_hint */] table_list 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 [, ...] ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ LIMIT { [offset,] count | ALL } ]
  • 注意事项 表的所有者、拥有表UPDATE权限的用户或拥有UPDATE ANY TABLE权限的用户,皆有权限更新表中的数据,当三权分立开关关闭时,系统管理员默认拥有此权限。 对expression或condition条件里涉及到的任何表需要有SELECT权限。 生成列不能被直接写入。在UPDATE命令中不能为生成列指定值,但是可以指定关键字DEFAULT。 对于多表更新语法,暂时不支持对视图及含有RULE的表进行多表更新。 对于子查询是STREAM计划的UPDATE语句,不支持并发更新同一行。 不支持用户通过UPDATE系统表的方式对数据库字符编码进行修改,该操作会导致存在存量数据或其他部分操作异常的情况。如需更改数据库的字符集编码,应当遵循切换数据库流程,进行相关的数据迁移操作。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [/*+ plan_hint */] [ ONLY ] {table_name [ partition_clause ] | subquery | view_name} [ * ] [ [ AS ] alias ] SET {column_name = { expression | DEFAULT } |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...] [ FROM from_list] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] [ LIMIT row_count ] [ RETURNING {* | {output_expression [ [ AS ] output_name ]} [, ...] }]; where sub_query can be: SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] { * | {expression [ [ AS ] output_name ]} [, ...] } [ FROM from_item [, ...] ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ GROUP BY grouping_element [, ...] ] [ HAVING condition [, ...] ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ LIMIT { [offset,] count | ALL } ]
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。这种子查询语句结构称为CTE(Common Table Expression)结构,应用这种结构时,执行计划中将存在CTE SCAN的内容。 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 其中with_query的详细格式为: with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( {select | values | insert | update | delete} ) with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 column_name指定子查询结果集中显示的列名。 每个子查询可以是SELECT、VALUES、INSERT、UPDATE或DELETE语句。 用户可以使用MATERIALIZED或NOT MATERIALIZED对CTE进行修饰。 如果声明为MATERIALIZED,WITH查询将被物化,生成一个子查询结果集的复制,在引用处直接查询该复制,因此WITH子查询无法和主干SELECT语句进行联合优化(如谓词下推、等价类传递等),对于此类场景可以使用NOT MATERIALIZED进行修饰,如果WITH查询语义上可以作为子查询内联执行,则可以进行上述优化。 如果用户没有显示声明物化属性则遵守以下规则:如果CTE只在所属SELECT主干中被引用一次,且语义上支持内联执行,则会被改写为子查询内联执行,否则以CTE Scan的方式物化执行。 plan_hint 以/*+ */的形式在UPDATE关键字后,用于对UPDATE对应的语句块生成的计划进行hint调优,详细用法请参见章节使用Plan Hint进行调优。每条语句中只有第一个/*+ plan_hint */注释块会作为hint生效,里面可以写多条hint。 table_name 要更新的表名,可以使用模式修饰。如果在表名前指定了ONLY,只会更新表中匹配的行。如果未指定,任何从该表继承到的表中的匹配行也会被更新。 取值范围:已存在的表名称。 支持使用DATABASE LINK方式对远端表进行操作,使用方式详情请见DATABASE LINK。 subquery 要更新的子查询,在对子查询进行更新时,会将子查询当成一个临时视图,支持在子查询后面加CHECK OPTION选项。 [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [/*+ plan_hint */] [ ALL ] { * | {expression [ [ AS ] output_name ]} [, ...] } [ into_option ] [ FROM from_item [, ...] ] [ WHERE condition ] [ [ START WITH condition ] CONNECT BY [NOCYCLE] condition [ ORDER SIBLINGS BY expression ] ] [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ] [ into_option ]; 其中指定子查询源from_item为: {[ ONLY ] {table_name | view_name} [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |( select ) [ AS ] alias [ ( column_alias [, ...] ) ] |with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] |from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]} 如果子查询中只有一张表,则对该表更新数据;如果子查询中有多张表或有嵌套关系,则通过判断是否有保留键表确定是否可更新。关于保留键表和WITH CHECK OPTION请参见CREATE VIEW。 view_name 要更新的目标视图。 对视图和子查询的更新,有如下约束: 只有直接引用基表用户列的列可进行UPDATE操作。 子查询或视图必须至少包含一个可更新列,关于可更新列请参见CREATE VIEW。 不支持在顶层包含DISTINCT、GROUP BY、HAVING、LIMIT、OFFSET子句的视图和子查询。 不支持在顶层包含集合运算(UNION、INTERSECT、EXCEPT、MINUS)的视图和子查询。 不支持目标列表中包含聚集函数、窗口函数、返回集合函数(array_agg、json_agg、generate_series等)的视图和子查询。 不支持仅带有BEFORE/AFTER触发器,没有INSTEAD OF触发器或INSTEAD规则的视图。 视图和子查询中支持的表类型包括普通表、临时表、全局临时表、分区表、二级分区表、ustore表、astore表。 多表连接视图或连接子查询中一次只能更新一张基表。 连接视图或子查询只能更新保留键表,如果指定了CHECK OPTION选项,则无法对连接列做更新操作。关于保留键表请参见CREATE VIEW。 不支持更新系统视图。 partition_clause 指定分区更新操作。 PARTITION { ( partition_name [, ...] ) | FOR ( partition_value [, ...] ) } PARTITION指定多个分区名时,可以存在相同的分区名,最终分区范围取其并集。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 column_name 要修改的字段名。 支持使用目标表的别名加字段名来引用这个字段。例如:UPDATE foo AS f SET f.col_name = 'namecol'。 取值范围:已存在的字段名。 expression 赋给字段的值或表达式。 DEFAULT 用对应字段的缺省值填充该字段。 如果没有缺省值,则为NULL。 sub_query 子查询。 使用同一数据库里其他表的信息来更新一个表可以使用子查询的方法。其中SELECT子句具体介绍请参考SELECT。 在update单列时,支持使用order by子句与limit子句;而在update多列时,则不支持使用order by子句与limit子句。 from_list 一个表的表达式列表,允许在WHERE条件里使用其他表的字段。与在一个SELECT语句的FROM子句里声明表列表类似。 目标表不能出现在from_list里,除非在使用一个自连接(此时它必须以from_list的别名出现)。 condition 一个返回Boolean类型结果的表达式。只有这个表达式返回true的行才会被更新。不建议使用int等数值类型作为condition,因为int等数值类型可以隐式转换为Boolean值(非0值隐式转换为true,0转换为false),可能导致非预期的结果。 WHERE CURRENT OF cursor_name 当cursor指向表的某一行时,可以使用此语法更新cursor当前指向的行。 cursor_name:指定游标的名称。 MYSQL兼容模式的数据库不支持使用此语法。 此语法仅支持普通表,不支持分区表,不支持Hash Bucket表。 仅支持在存储过程中使用。 不支持与其他WHERE条件组合使用。 不支持与WITH、USING、ORDER BY、FROM组合使用。 CURSOR对应的SELECT语句必须声明为FOR UPDATE。 CURSOR对应的SELECT语句仅支持单表,不支持LIMIT/OFFSET,不支持带有子查询、子链接。 存储过程中声明为FOR UPDATE的CURSOR,在COMMIT/ROLLBACK后,将无法再次使用。 若CURSOR指向的行已经不存在,在ORA兼容性模式下将报错指定的行不存在(仅UPDATE时报错,DELETE不报错),其他兼容模式下不报错。 ORDER BY 关键字具体请参见SELECT章节介绍。 LIMIT 关键字具体请参见SELECT章节介绍。 RETURNING output_expression 在所有需要更新的行都被更新之后,UPDATE命令用于计算返回值的表达式。 取值范围:使用任何TABLE以及FROM中列出的表的字段。*表示返回所有字段。 output_name 字段的返回名称。
  • 注意事项 表的所有者、拥有表UPDATE权限的用户或拥有UPDATE ANY TABLE权限的用户,皆有权限更新表中的数据,当三权分立开关关闭时,系统管理员默认拥有此权限。 UPDATE...... LIMIT row_count 仅支持执行计划下推的部分场景(不支持复制表),前置条件要求过滤条件包含等值分布列且过滤条件相对简单,避免出现强制类型转换的情况。如果执行失败,请简化过滤条件。 对expression或condition条件里涉及到的任何表要有SELECT权限。 仅当表属性enable_update_distkey设置为on,且在约束条件下时,支持更新(UPDATE)分布列的操作。否则,分布列不支持更新(UPDATE)操作。 支持更新(UPDATE)分布列操作的约束如下: 仅当相应表属性enable_update_distkey设置为on时才支持更新分布列; 不支持将UPDATE语句下推DN执行,直接生成PGXC计划,不会根据更新分布列前后值而对计划做改变; 不支持带有行级UPDATE TRIGGER的表,否则会执行失败,报错进行提示。对行级INSERT/DELETE TRIGGER不生效,update statement级TRIGGER正常执行; 不支持并发更新同一行,先获取锁的执行,DN上后获取锁的按照GUC参数concurrent_dml_mode设置情况进行不同的行为(返回0或报错)。如果报错,则可能存在两种情况:(1)报错提示信息为update distribute column conflict;(2)当获取锁时间超过阈值时,报错提示信息为锁超时。 不支持带有全局二级索引(GSI)的表,否则会执行报错; 只支持HASH分布,不支持LIST/RANGE分布表,否则会执行报错; 不支持MERGE INTO和UPSERT更新分布列的行为,否则会执行报错; 不支持gtm_free,否则会执行报错; 不支持UPDATE RETURNING,否则会执行报错; 不支持带有关联表的语句,否则会执行报错; 不支持UPDATE + LIMIT,否则会执行报错。 对于子查询是STREAM计划的UPDATE语句,不支持并发更新同一行。 不支持用户通过UPDATE系统表的方式对数据库字符编码进行修改,该操作会导致存在存量数据或其他部分操作异常的情况。如需更改数据库的字符集编码,应当遵循切换数据库流程,进行相关的数据迁移操作。