요소를 테이블에 업세 팅할 때 '열 참조가 모호합니다'


16

PostgreSQL을 데이터베이스로 사용하고 있습니다. 그리고 데이터베이스에 항목을 만들어야하며 이미 존재하는 경우 해당 필드를 업데이트하면되지만 필드 중 하나는 설정되지 않은 경우에만 업데이트해야합니다.

이 질문의 정보를 사용 했습니다 : https : //.com/questions/13305878/dont-update-column-if-update-value-is-null , 그것은 내가 가진 것과 매우 관련이 있습니다.

이 쿼리를 사용하려고 시도했지만 실행할 때 오류가 발생했습니다 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);

(실제 값은 물론 대체됩니다).

내가 교체 할 경우 affiliate_code = COALESCE(affiliate_code, value3)affiliate_code = value3모든 작업, 길에서 나는 일을하지 그러나.

이 작업을 어떻게 수행 할 수 있습니까?

내 테이블을 정의하는 방법은 다음과 같습니다.

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

4
시도하십시오 = COALESCE(accounts.affiliate_code, EXCLUDED.affiliate_code).
ypercubeᵀᴹ

답변:


16

문서에서

conflict_action 은 대체 ON CONFLICT 조치를 지정합니다. DO NOTHING이거나 충돌시 수행 할 UPDATE 조치의 정확한 세부 사항을 지정하는 DO UPDATE 절일 수 있습니다. ON CONFLICT DO UPDATE 의 SET 및 WHERE 절 은 테이블 이름 (또는 별명)을 사용하여 기존 행 및 특수 제외 테이블을 사용하여 삽입하도록 제안 된 행에 액세스 할 수 있습니다. 제외 된 해당 열을 읽는 대상 테이블의 모든 열에 대해 SELECT 권한이 필요합니다.

대신, 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.