Dado:
CREATE TABLE A (
PK_A INT8 NOT NULL,
A INT8,
PRIMARY KEY (PK_A)
);
CREATE TABLE B (
PK_B INT8 NOT NULL,
B INT8,
PRIMARY KEY (PK_B)
);
Esta consulta:
insert into table_b (pk_b, b)
select pk_a,a from table_a
on conflict (b) do update set b=a;
causa o seguinte erro:
ERROR: column "a" does not exist LINE 1: ...elect pk_a,a from table_a on conflict (b) do update set b=a; ^ HINT: There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query.
Como fazer a atualização enquanto se refere ao conteúdo de table_a
?
postgresql
postgresql-9.5
upsert
Tony Indrali
fonte
fonte
CREATE TABLE A...
cria tabelaa
, nãotable_a
.do update set b = a;
não consegue encontrar "a", porque há referência à Tabela "b" e não ao Subquery, tentedo update set b = (select a from a);
Respostas:
Problemas múltiplos.
Sua configuração, estendida:
Isso funciona:
Resultado:
Os problemas
Você está confuso
table_a
eA
em sua demonstração (como o @Abelisto comentou ).O uso de identificadores legais, em minúsculas e sem aspas ajuda a evitar confusões.
Como o @Ziggy mencionado ,
ON CONFLICT
funciona apenas para violações reais de restrição única ou de exclusão . O manual:Conseqüentemente,
não pode funcionar, sem restrições por lá.ON CONFLICT (b)
ON CONFLICT (pk_b)
trabalho.Como o @Ziggy também mencionado , os nomes das tabelas de origem não são visíveis na
UPDATE
peça. O manual:Negrito ênfase minha.
Você também não pode usar nomes de colunas da tabela de origem na
UPDATE
peça. Deve ser o nome da coluna da linha de destino . Então você realmente quer:O manual mais uma vez:
fonte
b = excluded.a
não pode funcionar, estava um pouco escondido no Docu oficial.Ao fazer upserts no PostgreSQL 9.5+, você deve se referir aos dados excluídos (aqueles que não foram inseridos) pelo alias
excluded
. Além disso, aon conflict
opção deve se referir à chave: em(pk_b)
vez de(b)
. Por exemplo.Para mais informações, consulte a documentação oficial ou esta introdução fácil ao upsert .
fonte