在 Postgresql upsert 期间附加数组并出现不明确的列错误

sb9*_*sb9 1 postgresql

尝试执行如下查询时:

INSERT INTO employee_channels (employee_id, channels)
        VALUES ('46356699-bed1-4ec4-9ac1-76f124b32184', '{a159d680-2f2e-4ba7-9498-484271ad0834}')
        ON CONFLICT (employee_id)
        DO UPDATE SET channels = array_append(channels, 'a159d680-2f2e-4ba7-9498-484271ad0834')
        WHERE employee_id = '46356699-bed1-4ec4-9ac1-76f124b32184'
        AND NOT lower(channels::text)::text[] @>  ARRAY['a159d680-2f2e-4ba7-9498-484271ad0834'];
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

[42702] ERROR: column reference "channels" is ambiguous Position: 245
Run Code Online (Sandbox Code Playgroud)

它所指的通道的具体引用是 array_append 中的“通道”。

通道是 CITEXT[] 数据类型

Gre*_*ius 5

您可能需要EXCLUDED在 set 语句中指定表。

SET channels = array_append(EXCLUDED.channels, 'a159d680-2f2e-4ba7-9498-484271ad0834')
Run Code Online (Sandbox Code Playgroud)

使用该ON CONFLICT DO UPDATE子句时,由于冲突而未插入的值存储在EXCLUDED表中。它是一个临时表,您不必实际制作,方式NEWOLD触发器中。

PostgreSQL 手册

conflict_action 指定替代 ON CONFLICT 操作。它可以是 DO NOTHING 或 DO UPDATE 子句,指定在发生冲突时要执行的 UPDATE 操作的确切细节。ON CONFLICT DO UPDATE 中的 SET 和 WHERE 子句可以使用表名(或别名)访问现有行,并使用特殊排除表访问建议插入的行。目标表中读取相应排除列的任何列都需要 SELECT 权限。

请注意,所有每行 BEFORE INSERT 触发器的影响都反映在排除值中,因为这些影响可能导致行被排除在插入之外。