PostgreSQL创建生成列时出现语法错误,为什么?

3

我有一个包含两列的Postgres表(标识符和日期),它们是复合主键。我想要将它们拼接起来并哈希到另一列中,在每次插入新记录时生成这个值。为此,我正在尝试修改我的表以创建一个生成列:

ALTER TABLE my_table ADD COLUMN hash_id_date VARCHAR(50)
GENERATED ALWAYS AS (MD5(my_table.original_id||'-'||my_table.time))
STORED;

这让我遇到了以下错误:
ERROR:  syntax error at or near "("
LINE 4: GENERATED ALWAYS AS (MD5(my_table.original_id,'-',my_table.t...
                            ^
SQL state: 42601
Character: 178

我为寻找语法错误而陷入疯狂......我已经阅读了有关STABLEIMMUTABLE函数以及生成列应始终具有IMMUTABLE函数作为表达式的文章。据我所知,MD5IMMUTABLE的,但错误消息甚至无法达到那个级别。 有任何帮助吗?

我会尝试逐个从计算子句中删除元素,以找出导致问题的原因 - 例如,尝试使用AS ((my_table.original_id ||'-'|| my_table.time))而不是MD5,尝试不使用concat等... - paranoidAndroid
6
select version();会返回MySQL数据库版本信息。 - user330315
4
是的,@a_horse_with_no_name,你的怀疑是正确的。我的当前版本不支持生成列。我正在创建一个新的列,并尝试使用触发器模拟它,但是我的当前行不受影响。我正在尝试使用每行的值更新我的表格。 - Carlos
@a_horse_with_no_name 这正是我遇到的问题。本地运行良好,因为它是Postgres v12,但我的部署环境是v10。 - uberdwang
1个回答

1
假设计算MD5的基本功能是通用的,您可以创建一个用于计算的函数。在需要的地方使用此函数,包括更新当前行并从触发器中调用您的表。如果特定的MD5计算不是很常见,您可以将计算放入触发器函数中,并在独立更新当前行时使用它。请参见此处的示例,假设它在您的应用程序中很常见。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接