Debe calificar la columna en la tabla donde de otro modo sería ambigua.
Use el nombre de la tabla virtual excluded
para hacer referencia a la fila de entrada. Pero probablemente desee referirse a la columna de destino, así que califique con el nombre de la tabla de destino:
INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1 -- here
RETURNING count;
La única fila de la tabla de entrada virtual excluded
contiene todo columnas de la tabla de destino, incluso si no aparecen en la lista de columnas de destino de INSERT
o los VALUES
expresión. Entonces, la ambigüedad que encontró siempre está ahí, ya sea count
está dirigido explícitamente o no.
Aparte:las columnas omitidas en la lista de columnas de destino tienen por defecto su columna respectiva DEFAULT
valor, que es NULL
por defecto (NULL
siendo la columna por defecto DEFAULT
). Es decir, por defecto sería NULL
en su configuración y 1
en mi configuración mejorada a continuación. Y desencadenadores de nivel de fila BEFORE INSERT
(si corresponde) se aplican.
Pero nada de eso se aplica al ejemplo, ya que se refiere al objetivo columna después de todo.
En particular, las otras dos instancias del nombre de columna count
son inequívocos (y por lo tanto no requieren calificación de tabla) ya que solo pueden referirse al objetivo mesa.
Su configuración puede romperse fácilmente mientras la columna count
no está definido NOT NULL
, como NULL + 1
sigue siendo NULL
. Esta configuración tendría más sentido:
CREATE TABLE test.test_counter (
id text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);
Tampoco uso nombres de casos de CaMeL entrecomillados en mi ejemplo. Ver: