একাধিক সমস্যা।
আপনার সেটআপ, প্রসারিত:
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
আপনার ডেমোতে আছেন (যেমন @ আবেলিস্টো মন্তব্য করেছেন )।
আইনী, লোয়ার-কেস, অব্যক্ত সনাক্তকারীদের ব্যবহার বিভ্রান্তি এড়াতে সহায়তা করে।
উল্লিখিত জিগির মতো , ON CONFLICT
কেবল প্রকৃত অনন্য বা বর্জনীয় সীমাবদ্ধতা লঙ্ঘনের জন্য কাজ করে । ম্যানুয়াল:
.চ্ছিক ON CONFLICT
চ্ছিক ধারাটি একটি অনন্য লঙ্ঘন বা বর্ধনের সীমাবদ্ধতা লঙ্ঘনের ত্রুটি বাড়াতে বিকল্প ক্রিয়াকে নির্দিষ্ট করে।
অতএব, ON CONFLICT (b)
কাজ করতে পারে না, সেখানে কোনও বাধা নেই। ON CONFLICT (pk_b)
কাজ করে।
@ জিগির মতো এটিও উল্লেখ করা আছে , উত্স সারণীর নামগুলি এর মধ্যে দৃশ্যমান নয়UPDATE
অংশ। ম্যানুয়াল:
SET
এবং WHERE
ধারা ON CONFLICT DO UPDATE
সারণীর নাম (বা উপনাম) ব্যবহার করে বিদ্যমান সারি এক্সেস আছে, এবং বিশেষ ব্যবহার সন্নিবেশ জন্য প্রস্তাবিত সারিexcluded
টেবিল ।
বোল্ড জোর আমার।
আপনি অংশে উত্স সারণীর কলামের নামগুলিও ব্যবহার করতে পারবেন না UPDATE
। এটি অবশ্যই লক্ষ্য সারির কলামের নাম হতে হবে । সুতরাং আপনি সত্যিই চান:
SET b = excluded.b
ম্যানুয়ালটি আরও একবার:
নোট করুন যে প্রতি-সারি BEFORE INSERT
ট্রিগারগুলির প্রভাবগুলি বাদ দেওয়া মানগুলিতে প্রতিফলিত হয়, যেহেতু এই প্রভাবগুলি সন্নিবেশ থেকে বাদ দেওয়া সারিটিতে অবদান রাখতে পারে।
CREATE TABLE A...
টেবিল তৈরি করেa
, নাtable_a
।