PostgreSQL,使用select插入在冲突do更新时失败
我试图解决在pg12中插入pk失败时进行更新的问题。我认为,这很容易,只是在查询中出现冲突。。。但是没有。 运行查询时,出现以下错误:PostgreSQL,使用select插入在冲突do更新时失败,sql,postgresql,Sql,Postgresql,我试图解决在pg12中插入pk失败时进行更新的问题。我认为,这很容易,只是在查询中出现冲突。。。但是没有。 运行查询时,出现以下错误: ERROR: column excluded.fec does not exist LINE 25: ...ON CONFLICT (address) DO UPDATE SET saldo.fecha = EXCLUDED.f... ^
ERROR: column excluded.fec does not exist
LINE 25: ...ON CONFLICT (address) DO UPDATE SET saldo.fecha = EXCLUDED.f...
^
SQL state: 42703
Character: 1052
下表:
CREATE UNLOGGED TABLE wallet.saldo
(
address character varying(42) COLLATE pg_catalog."default" NOT NULL,
fecha timestamp without time zone NOT NULL,
saldo numeric(60,20) NOT NULL,
CONSTRAINT wallet_saldo_address_pk PRIMARY KEY (address)
)
查询:
INSERT INTO wallet.saldo(address, fecha, saldo)
select '0xaa515035c04aab' as token_address, max(block_timestamp)::date as fec, sum(importe) as imp
from (
SELECT
tt.block_timestamp, tt.value::numeric(60,20) / ('1' || left('0000000000000000000000000', t.decimals))::numeric * -1 as importe
FROM raw.token_transfers tt inner join raw.tokens t on t.address = tt.token_address
where to_address = '0xaa515035c04aab'
and tt.block_timestamp between '20201009 00:00:00' and '20201009 23:59:59.99999'
union
SELECT
tt.block_timestamp, (tt.value::numeric(60,20) / ('1' || left('0000000000000000000000000', t.decimals))::numeric) as importe
FROM raw.token_transfers tt inner join raw.tokens t on t.address = tt.token_address
where from_address = '0xaa515035c04aab'
and tt.block_timestamp between '20201009 00:00:00' and '20201009 23:59:59.99999'
) as det
ON CONFLICT (address) DO UPDATE SET saldo.fecha = EXCLUDED.fec, saldo.saldo = EXCLUDED.imp
;
select DET工作正常,返回正确的值,如果尝试用DET(别名)替换EXCLUDED,则错误相同
请问,我做错了什么?排除总是指目标表的列名,而不是源。您也不能使用分配左侧的目标表名称 所以你需要
SET fecha = EXCLUDED.fecha,
saldo = EXCLUDED.saldo
错误消息非常清楚:“列fec不存在”,也不存在imp列是的,谢谢,你说得对,我复制了一个版本的查询和previos的结果。我编辑了这个问题,非常感谢!对我刚刚删除了表名集。