'La referencia de columna es ambigua' al insertar un elemento en la tabla


16

Estoy usando PostgreSQL como mi base de datos. Y necesito crear una entrada en la base de datos, y si ya existe, simplemente actualice sus campos, pero uno de los campos debería actualizarse solo si no está configurado.

He usado información de esta pregunta: /programming/13305878/dont-update-column-if-update-value-is-null , está bastante relacionado con lo que tengo.

Intenté usar esta consulta, pero cuando la ejecuto, aparece un error con Column reference 'affiliate_code' is ambiguous:

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(affiliate_code, value3);

(los valores reales se sustituyen, por supuesto).

Si lo reemplazo affiliate_code = COALESCE(affiliate_code, value3)con affiliate_code = value3, todo funciona, pero no de la forma en que quiero que funcione.

¿Cómo puedo hacer que esto funcione?

Así es como se define mi tabla:

CREATE TABLE accounts (
  id VARCHAR NOT NULL UNIQUE,
  token VARCHAR NOT NULL,
  affiliate_code VARCHAR
);

44
Tratar = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

Respuestas:


16

De los documentos,

conflict_action especifica una acción alternativa EN CONFLICTO. Puede ser NO HACER NADA o una cláusula DO UPDATE que especifique los detalles exactos de la acción UPDATE que se realizará en caso de conflicto. Las cláusulas SET y WHERE en ON CONFLICT DO UPDATE tienen acceso a la fila existente usando el nombre de la tabla (o un alias), y a las filas propuestas para inserción usando la tabla especial excluida. Se requiere el privilegio SELECT en cualquier columna de la tabla de destino donde se leen las columnas excluidas correspondientes.

Entonces, en vez de eso, prueba esto por ypercubeᵀᴹ

INSERT INTO accounts (id, token, affiliate_code)
VALUES (value1, value2, value3)
ON CONFLICT (id) DO
UPDATE SET token = value2,
  affiliate_code = COALESCE(accounts.affiliate_code, excluded.affiliate_code);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.