在Postgresql Upsert期间追加数组并得到模棱两可的列错误

时间:2019-01-18 21:46:17

标签: 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'];

我收到以下错误

[42702] ERROR: column reference "channels" is ambiguous Position: 245

它所引用的通道的具体引用是array_append内部的“通道”。

channels是CITEXT []数据类型

1 个答案:

答案 0 :(得分:0)

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

SET channels = array_append(EXCLUDED.channels, 'a159d680-2f2e-4ba7-9498-484271ad0834')

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

来自PostgreSQL Manual

  

conflict_action指定另一种ON CONFLICT动作。它可以是DO NOTHING,也可以是指定确切的DO UPDATE子句   发生冲突时要执行的UPDATE操作的详细信息。   ON CONFLICT DO UPDATE中的SET和WHERE子句可以访问   使用表名(或别名)的现有行以及行   建议使用特殊排除表插入。选择   目标表中的任何列都需要特权,其中   读取相应的排除列。

     

请注意,INSERT触发器之前所有按行的影响均反映在排除的值中,因为这些影响可能已经   到从插入中排除的行。