PostgreSQL 15中INSERT ON CONFLICT带WHERE子句遇列歧义错误求解
解决PostgreSQL Upsert列引用歧义问题
错误原因
报错ERROR: column reference "last_sequence_number" is ambiguous是因为ON CONFLICT DO UPDATE的WHERE子句中,last_sequence_number同时存在于目标表events和待插入的行数据中,PostgreSQL无法区分你要引用哪一方的列值。另外你的SQL里还有拼写错误:last_seequence_number少了一个字母q,这也会引发异常。
修正后的SQL语句
需要明确指定列的来源:用events.last_sequence_number指代目标表已存在行的列,用EXCLUDED.last_sequence_number指代待插入的新值(也可以直接用参数$10,但EXCLUDED是PostgreSQL Upsert中专门指代待插入行的关键字,写法更规范)。修正后的语句如下:
INSERT INTO events ( uuid, event_id, event_type, ... last_sequence_number ) VALUES ( $1, $2, $3, ..., $10 ) ON CONFLICT (uuid) DO UPDATE SET event_id = $2, event_type = $3, ..., last_sequence_number = $10 WHERE events.last_sequence_number IS NULL OR events.last_sequence_number < EXCLUDED.last_sequence_number RETURNING *;
功能说明
- 当
uuid不存在时,直接执行插入操作,满足你的第一个需求; - 当
uuid存在时,仅在目标表现有行的last_sequence_number为NULL,或小于待插入的新序列号时才执行更新,完美适配乱序事件流的处理逻辑,自动忽略旧事件; - PostgreSQL 15完全支持这种写法,本次报错仅为写法不规范和拼写错误导致,与版本无关。
内容的提问来源于stack exchange,提问作者GSP
相关产品推荐
相关产品推荐

