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;
provoca el siguiente error:
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.
¿Cómo hacer la actualización haciendo referencia al contenido de table_a
?
postgresql
postgresql-9.5
upsert
Tony Indrali
fuente
fuente
CREATE TABLE A...
crea tablaa
, notable_a
.do update set b = a;
no puede encontrar "a" porque hay referencia a la Tabla "b" y no a la Subconsulta, intentedo update set b = (select a from a);
Respuestas:
Múltiples problemas
Su configuración, extendida:
Esto funciona:
Resultado:
Los problemas
Eres confuso
table_a
yA
estás en tu demo (como comentó @Abelisto ).El uso de identificadores legales, en minúsculas y sin comillas, ayuda a evitar confusiones.
Como mencionó @Ziggy ,
ON CONFLICT
solo funciona para infracciones de restricción de exclusión o exclusivas reales . El manual:En consecuencia,
no puede funcionar, no hay restricción allí.ON CONFLICT (b)
ON CONFLICT (pk_b)
trabajos.Como también mencionó @Ziggy , los nombres de las tablas de origen no son visibles en la
UPDATE
parte. El manual:El énfasis audaz es mío.
Tampoco puede usar nombres de columna de la tabla fuente en la
UPDATE
parte. Deben ser nombres de columna de la fila de destino . Entonces realmente quieres:El manual una vez más:
fuente
b = excluded.a
no puede funcionar, estaba un poco oculto en la Docu oficial.Al realizar upserts en PostgreSQL 9.5+, debe hacer referencia a los datos excluidos (los que no pudieron insertarse) por el alias
excluded
. Además, laon conflict
opción debe referirse a la clave: en(pk_b)
lugar de(b)
. P.ej.Para obtener más información, consulte la documentación oficial o esta fácil introducción a upsert .
fuente