要素をテーブルにアップサートするときに「列参照があいまいです」


16

データベースとしてPostgreSQLを使用しています。そして、データベースにエントリを作成する必要があります。それが既に存在する場合は、そのフィールドを更新するだけですが、フィールドの1つは、設定されていない場合にのみ更新する必要があります。

私はこの質問の情報を使用しました:https : //stackoverflow.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.