Solución:
De los documentos,
conflicto_accion especifica una acción alternativa EN CONFLICTO. Puede ser DO NOTHING 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 EN CONFLICTO ACTUALIZAR tenga acceso a la fila existente usando el nombre de la tabla (o un alias), y a las filas propuestas para la inserción usando la tabla excluida especial. Se requiere el privilegio SELECT en cualquier columna de la tabla de destino donde se leen las columnas excluidas correspondientes.
Entonces, en su lugar, intente 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);
Esta respuesta me ayudó a resolver un problema de columna ambiguo ligeramente diferente. Tengo una mesa en la que hacemos acumulaciones diarias en la misma mesa varias veces al día. Necesitamos volver a calcular la acumulación diaria por horas, lo que significa que estamos actualizando la misma fila 24 veces al día.
Parafraseando lo anterior:
INSERT INTO accounts as act
(affiliate_code, datum)
SELECT affiliate_code, datum
FROM
-- complex multi-table join with "datum" in more than one table.
ON CONFLICT (affiliate_code) DO
UPDATE SET
-- Update knows "datum" is the target row
datum = excluded.datum
WHERE
-- Here update needs to be told which of the multiple tables
-- with datum to use.
act.datum != excluded.datum;