'การอ้างอิงคอลัมน์ไม่ชัดเจน' เมื่อเพิ่มองค์ประกอบลงในตาราง


16

ฉันใช้ PostgreSQL เป็นฐานข้อมูลของฉัน และฉันจำเป็นต้องสร้างรายการในฐานข้อมูลและหากมีอยู่แล้วเพียงแค่อัปเดตฟิลด์ แต่ควรอัปเดตหนึ่งในฟิลด์ต่อไปหากยังไม่ได้ตั้งค่า

ฉันใช้ข้อมูลจากคำถามนี้: /programming/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

จากเอกสาร

ขัดแย้ง_actionระบุการกระทำทางเลือก ON CONFLICT อาจเป็นอะไรก็ได้หรือประโยค DO UPDATE ระบุรายละเอียดที่แน่นอนของการดำเนินการ UPDATE ที่จะดำเนินการในกรณีที่มีข้อขัดแย้ง SET และ WHERE clause ในON CONFLICT DO UPDATE สามารถเข้าถึงแถวที่มีอยู่โดยใช้ชื่อของตาราง (หรือนามแฝง) และแถวที่เสนอสำหรับการแทรกโดยใช้ตารางยกเว้นพิเศษ ต้องใช้สิทธิ์ SELECT ในคอลัมน์ใด ๆ ในตารางเป้าหมายที่อ่านคอลัมน์ที่ยกเว้นที่สอดคล้องกัน

ดังนั้นให้ลองใช้วิธีนี้ต่อ ypercube instead

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.