ปัญหาหลายอย่าง
การตั้งค่าของคุณขยาย:
CREATE TABLE a (
pk_a int PRIMARY KEY
, a int
, comment text -- added column to make effect clear
);
CREATE TABLE b (
pk_b int PRIMARY KEY
, b int
, comment text
);
INSERT INTO a VALUES (1, 11, 'comment from a')
, (2, 22, 'comment from a');
INSERT INTO b VALUES (1, 77, 'comment from b');
งานนี้:
INSERT INTO b (pk_b, b, comment)
SELECT pk_a, a, comment
FROM a
ON CONFLICT (pk_b) DO UPDATE -- conflict is on the unique column
SET b = excluded.b; -- key word "excluded", refer to target column
ผลลัพธ์:
TABLE b;
pk_b | b | comment
------+----+----------------
1 | 11 | comment from b -- updated
2 | 22 | comment from a -- inserted
ปัญหา
คุณกำลังสับสนtable_a
และA
ในการสาธิตของคุณ (เช่น@Abelisto แสดงความคิดเห็น )
การใช้ตัวระบุที่ไม่ได้เป็นตัวพิมพ์เล็กและถูกกฎหมายจะช่วยหลีกเลี่ยงความสับสน
เช่นเดียวกับ@Ziggy กล่าวถึง , ON CONFLICT
ทำงานเฉพาะสำหรับที่เกิดขึ้นจริงไม่ซ้ำกันหรือการยกเว้นการละเมิดข้อ จำกัด คู่มือ:
ON CONFLICT
ประโยคที่เป็นตัวเลือกระบุการดำเนินการทางเลือกเพื่อเพิ่มข้อผิดพลาดการละเมิดข้อ จำกัด การละเมิดหรือการยกเว้นที่ไม่ซ้ำกัน
ดังนั้นON CONFLICT (b)
ไม่สามารถทำงานได้ไม่มีข้อ จำกัด ON CONFLICT (pk_b)
โรงงาน
เช่นเดียวกับ@Ziggy ยังกล่าวถึง , แหล่งที่มาของชื่อตารางจะไม่ปรากฏในUPDATE
ส่วนหนึ่ง คู่มือ:
SET
และWHERE
คำสั่งในการON CONFLICT DO UPDATE
มีการเข้าถึงไปยังแถวที่มีอยู่โดยใช้ชื่อของตาราง (หรือนามแฝง) และแถวที่นำเสนอสำหรับการแทรกการใช้พิเศษexcluded
ตาราง
เหมืองเน้นหนัก
คุณไม่สามารถใช้ชื่อคอลัมน์ของตารางต้นฉบับในUPDATE
ส่วนได้ มันจะต้องเป็นชื่อคอลัมน์ของเป้าหมายแถว ดังนั้นคุณต้องการ:
SET b = excluded.b
คู่มืออีกครั้ง:
โปรดทราบว่าเอฟเฟกต์ของBEFORE INSERT
ทริกเกอร์ต่อแถวทั้งหมดจะแสดงเป็นค่าที่ยกเว้นเนื่องจากเอฟเฟกต์เหล่านั้นอาจส่งผลต่อแถวที่ถูกแยกออกจากการแทรก
CREATE TABLE A...
สร้างตารางไม่a
table_a