Múltiples problemas
Su configuración, extendida:
CREATE TABLE a (
pk_a int PRIMARY KEY
, a int
, comment text -- added column to make effect clear
);
CREATE TABLE b (
pk_b int PRIMARY KEY
, b int
, comment text
);
INSERT INTO a VALUES (1, 11, 'comment from a')
, (2, 22, 'comment from a');
INSERT INTO b VALUES (1, 77, 'comment from b');
Esto funciona:
INSERT INTO b (pk_b, b, comment)
SELECT pk_a, a, comment
FROM a
ON CONFLICT (pk_b) DO UPDATE -- conflict is on the unique column
SET b = excluded.b; -- key word "excluded", refer to target column
Resultado:
TABLE b;
pk_b | b | comment
------+----+----------------
1 | 11 | comment from b -- updated
2 | 22 | comment from a -- inserted
Los problemas
Eres confuso table_a
y A
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:
La ON CONFLICT
cláusula opcional especifica una acción alternativa para generar una violación única o un error de violación de restricción de exclusión.
En consecuencia, ON CONFLICT (b)
no puede funcionar, no hay restricción allí. 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:
Las cláusulas SET
y tienen acceso a la fila existente utilizando el nombre de la tabla (o un alias), y a las filas propuestas para la inserción utilizando la tabla especial .WHERE
ON CONFLICT DO UPDATE
excluded
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:
SET b = excluded.b
El manual una vez más:
Tenga en cuenta que los efectos de todos los BEFORE INSERT
desencadenantes por fila se reflejan en valores excluidos, ya que esos efectos pueden haber contribuido a que la fila se excluya de la inserción.
CREATE TABLE A...
crea tablaa
, notable_a
.