'Referência de coluna é ambígua' ao fazer upserting de elemento na tabela


16

Estou usando o PostgreSQL como meu banco de dados. E preciso criar uma entrada no banco de dados e, se ela já existir, basta atualizar seus campos, mas um dos campos deve ser atualizado apenas se não estiver definido.

Usei as informações desta pergunta: /programming/13305878/dont-update-column-if-update-value-is-null , está bastante relacionado ao que tenho.

Tentei usar esta consulta, mas quando a executo, ela erros com 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);

(os valores reais são substituídos, é claro).

Se eu substituir affiliate_code = COALESCE(affiliate_code, value3)por affiliate_code = value3, tudo funciona, mas não da maneira que eu quero que funcione.

Como posso fazer isso funcionar?

Aqui está como minha tabela é definida:

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

4
Tente = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
precisa saber é o seguinte

Respostas:


16

Dos documentos,

confl_action especifica uma ação alternativa ON CONFLICT. Pode ser DO NADA ou uma cláusula DO UPDATE especificando os detalhes exatos da ação UPDATE a ser executada em caso de conflito. As cláusulas SET e WHERE em ON CONFLICT DO UPDATE têm acesso à linha existente usando o nome da tabela (ou um alias) e às linhas propostas para inserção usando a tabela excluída especial. O privilégio SELECT é necessário em qualquer coluna na tabela de destino em que as colunas excluídas correspondentes são lidas.

Então, tente isso 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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.