sql >> Base de Datos >  >> RDS >> PostgreSQL

Referencia de columna ambigua en INSERTAR... EN CONFLICTO HACER ACTUALIZAR

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;

El manual:

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: