【问题标题】:Postgresql create generated column syntax error, why?Postgresql 创建生成的列语法错误,为什么?
【发布时间】:2020-08-10 08:48:10
【问题描述】:

我有一个包含两列(标识符和日期)的 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 等...
  • select version(); 带给你什么?
  • 是的,@a_horse_with_no_name,你的怀疑是对的。我当前的版本不支持生成的列。我目前正在创建一个新列并尝试使用触发器模拟它,但是我当前的行不受此影响。我正在尝试使用每一行的值更新我的表。

标签: postgresql alter-table generated-columns


【解决方案1】:

假设计算 MD5 的基本功能是通用的,您可以创建一个计算函数。在任何需要的地方使用这个函数,包括更新你当前的行和从你的表上的触发器调用。如果特定的 MD5 计算不是那么常见,您可以将计算放在触发器函数中,并将其用于当前行的独立更新。例如,请参阅here,假设它在您的应用中很常见。

【讨论】:

    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 2014-03-13
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2021-01-08
    • 2016-02-04
    相关资源
    最近更新 更多