আপডেটের অংশে উত্স সারণী থেকে মান ব্যবহার করে অন কনফ্লিক্ট সহ ইউপিএসআরটি


18

প্রদত্ত:

CREATE TABLE A (
PK_A INT8 NOT NULL,
A INT8,
PRIMARY KEY (PK_A)
);

CREATE TABLE B (
PK_B INT8 NOT NULL,
B INT8,
PRIMARY KEY (PK_B)
);

এই ক্যোয়ারী:

insert into table_b (pk_b, b) 
select pk_a,a from table_a 
on conflict (b) do update set b=a;

নিম্নলিখিত ত্রুটির কারণ:

ERROR:  column "a" does not exist
LINE 1: ...elect pk_a,a from table_a on conflict (b) do update set b=a;
                                                                 ^
HINT:  There is a column named "a" in table "*SELECT*", but it cannot be referenced from this part of the query.

কীভাবে আপডেট করবেন table_a?


5
CREATE TABLE A...টেবিল তৈরি করে a, না table_a
অ্যাবেলিস্তো

do update set b = a;খুঁজে পাচ্ছি না "A" কারণ সারণীতে "B" এবং Subquery সেখানে রেফারেন্স, চেষ্টাdo update set b = (select a from a);
Patrick7

উত্তর:


25

একাধিক সমস্যা।
আপনার সেটআপ, প্রসারিত:

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

সমস্যা

  1. আপনি বিভ্রান্তিকর table_aএবং Aআপনার ডেমোতে আছেন (যেমন @ আবেলিস্টো মন্তব্য করেছেন )।

    আইনী, লোয়ার-কেস, অব্যক্ত সনাক্তকারীদের ব্যবহার বিভ্রান্তি এড়াতে সহায়তা করে।

  2. উল্লিখিত জিগির মতো , ON CONFLICTকেবল প্রকৃত অনন্য বা বর্জনীয় সীমাবদ্ধতা লঙ্ঘনের জন্য কাজ করেম্যানুয়াল:

    .চ্ছিক ON CONFLICT চ্ছিক ধারাটি একটি অনন্য লঙ্ঘন বা বর্ধনের সীমাবদ্ধতা লঙ্ঘনের ত্রুটি বাড়াতে বিকল্প ক্রিয়াকে নির্দিষ্ট করে।

    অতএব, ON CONFLICT (b) কাজ করতে পারে না, সেখানে কোনও বাধা নেই। ON CONFLICT (pk_b)কাজ করে।

  3. @ জিগির মতো এটিও উল্লেখ করা আছে , উত্স সারণীর নামগুলি এর মধ্যে দৃশ্যমান নয়UPDATE অংশ। ম্যানুয়াল:

    SETএবং WHEREধারা ON CONFLICT DO UPDATEসারণীর নাম (বা উপনাম) ব্যবহার করে বিদ্যমান সারি এক্সেস আছে, এবং বিশেষ ব্যবহার সন্নিবেশ জন্য প্রস্তাবিত সারিexcluded টেবিল

    বোল্ড জোর আমার।

  4. আপনি অংশে উত্স সারণীর কলামের নামগুলিও ব্যবহার করতে পারবেন না UPDATE। এটি অবশ্যই লক্ষ্য সারির কলামের নাম হতে হবে । সুতরাং আপনি সত্যিই চান:

    SET    b = excluded.b

    ম্যানুয়ালটি আরও একবার:

    নোট করুন যে প্রতি-সারি BEFORE INSERTট্রিগারগুলির প্রভাবগুলি বাদ দেওয়া মানগুলিতে প্রতিফলিত হয়, যেহেতু এই প্রভাবগুলি সন্নিবেশ থেকে বাদ দেওয়া সারিটিতে অবদান রাখতে পারে।


এই ব্যাখ্যাটির জন্য ধন্যবাদ, এখন আমি জানি কেন b = excluded.aকাজ করতে পারে না, এটি অফিসিয়াল ডকুতে কিছুটা লুকিয়ে ছিল।
প্যাট্রিক

ডমিগুলির জন্য সাধারণ একটি লাইনার যেমন: 'বঞ্চিত' নতুন আগত ডেটার দিকে নির্দেশ করে যা আপনি সন্নিবেশ করতে চান বা টেবিলটিতে অবিরত থাকতে চান।
user92674

8

পোস্টগ্রেএসকিউএল 9.5+ এ আপসার্টগুলি করার সময় আপনাকে অবশ্যই উপনাম দ্বারা বাদ দেওয়া ডেটা (যা সন্নিবেশ করতে ব্যর্থ হয়েছিল) উল্লেখ করতে হবে excluded। এছাড়াও, on conflictবিকল্প কী পড়ুন আবশ্যক: (pk_b)বদলে (b)। যেমন।

insert into table_b (pk_b, b) 
select pk_a,a from table_a 
on conflict (pk_b) do update set b=excluded.b;

আরও তথ্যের জন্য সরকারী ডকুমেন্টেশন বা উপস্থাপনের জন্য এই সহজ ভূমিকা দেখুন


এই কোয়েরিটি কাজ করে না
shx
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.