为什么在构造具有一个元素而不是两个元素的行时需要 ROW 关键字?

Ama*_*asu 2 postgresql syntax row

在 PostgreSQL 11 中,以下表达式

UPDATE test_table SET ("column_a","column_b") = ('value-a','value-b') WHERE "column_a" = 'value-c' 
Run Code Online (Sandbox Code Playgroud)

被接受并执行更新。

但是对于单个列/值,例如

UPDATE test_table SET ("column_a") = ('value-a') WHERE "column_a" = 'value-c'
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误。ROW必须提供,例如

UPDATE test_table SET ("column_a") = ROW ('value-a') WHERE "column_a" = 'value-c'
Run Code Online (Sandbox Code Playgroud)

有没有解释为什么选择这种行为?如果ROW缺少,是否有歧义?

mus*_*cio 6

通常情况下,可以在文档中找到答案。

UPDATE参考说,特别是:

根据标准,带括号的目标列名称子列表的源值可以是任何产生正确列数的行值表达式。PostgreSQL 只允许源值是行构造函数或子SELECT

而“行构造函数”的定义如下:

行构造函数是使用其成员字段的值构建行值(也称为复合值)的表达式。行构造函数由关键字ROW、左括号、零个或多个用于行字段值的表达式(用逗号分隔)以及最后一个右括号组成。[...]ROW当列表中有多个表达式时,关键字是可选的。

最后一句有点道理,因为括号中的单个表达式本身是不明确的,可能会与简单的括号表达式混淆。

此语法是在10 版中引入的——HT 到 ypercube™。