পোস্টগ্রিএসকিউএল ইনসার্ট অন কনফ্লিক্ট আপডেট (আপসার্ট) সমস্ত বর্জনিত মান ব্যবহার করুন


142

আপনি যখন একটি সারি (PostgreSQL> = 9.5) উপস্থাপন করছেন, এবং আপনি সম্ভাব্য INSERT সম্ভাব্য আপডেটের সাথে ঠিক একই রকম হতে চান, আপনি এটিকে এটি লিখতে পারেন:

INSERT INTO tablename (id, username, password, level, email) 
                VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') 
ON CONFLICT (id) DO UPDATE SET 
  id=EXCLUDED.id, username=EXCLUDED.username,
  password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email

একটি ছোট উপায় আছে? শুধু বলার জন্য: সমস্ত এক্সক্লুড মান ব্যবহার করুন।

এসকিউএলাইটে আমি করতাম:

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
                        VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')

43
: কোনো বাস্তব উত্তর কিন্তু আপনি সামান্য খুব শীঘ্রই স্বরলিপি ব্যবহার করতে পারেন INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET (username, password, level, email) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email).প্রায় একই কলাম তালিকা, কিন্তু সহজ কপি / পেস্ট / পরিচালনা
গর্ভিনী

আরেকটি বিকল্প হ'ল জসনব কলামগুলি ব্যবহার করা এবং সেভাবে আপনাকে কলামগুলি সম্পর্কে চিন্তা করতে হবে না
জে

উত্তর:


162

পোস্টগ্রিস এর সমতুল্য প্রয়োগ করে নি INSERT OR REPLACEON CONFLICTদস্তাবেজগুলি থেকে (জোর দেওয়া আমার):

এটি হয় না কিছুই হতে পারে, বা কোনও দ্বন্দ্বের ক্ষেত্রে সঞ্চালনের জন্য আপডেটের ক্রিয়াকলাপের সঠিক বিবরণ উল্লেখ করে একটি ডিও আপডেটের শর্ত থাকতে পারে।

যদিও এটি আপনাকে প্রতিস্থাপনের জন্য শর্টহ্যান্ড দেয় না, তবে ON CONFLICT DO UPDATEআরও সাধারণভাবে প্রযোজ্য, যেহেতু এটি আপনাকে প্রিসিস্টিং ডেটার উপর ভিত্তি করে নতুন মান সেট করতে দেয়। উদাহরণ স্বরূপ:

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;

3
সতর্কতার শব্দ হিসাবে, "আপডেটে থাকা" এসকিউএল স্ট্যান্ডার্ডের "মার্জ" এর সাথে শব্দার্থগতভাবে অভিন্ন নয়, যদিও এটি সাধারণত একই জায়গায় ব্যবহার করা যেতে পারে। আমার একটি কেস ছিল যেখানে আমি "অন সংঘর্ষ আপডেট" কিক্সার প্রত্যাশা করেছি, তবে সন্নিবেশের সঠিক সমস্যাটি আপডেটটি (যা ক্ষতিগ্রস্থ রেকর্ডটি মেরামত করতে পারে) এর কারণ হিসাবে আগুন লাগায় নি।
পোজো-লোক

2
আপনি কি "তে প্রসারিত করতে পারেন তবে সন্নিবেশের সঠিক সমস্যাটি আপডেটের কারণ হয়ে উঠেনি"?
MrR

@ পোজো-লোক - আমি মনে করি না আপনি মিঃআর এর কাছ থেকে প্রশ্নটি দেখেছেন - আপনি কি "প্রসারিত করতে পারেন তবে সন্নিবেশের সঠিক সমস্যাটি আপডেটের কারণ হিসাবে আসে নি"?
র্যান্ডল

আপনি যখন পোস্টগ্রেসকিএল আপডেট করার সময় সন্নিবেশ ... ব্যবহার করার চেষ্টা করছেন, ফলাফলগুলি নির্দিষ্ট কিছু পরিস্থিতিতে একত্রিত হওয়ার চেয়ে আলাদা। আমি যে কেসটি চালিয়েছি তা বরং অস্পষ্ট এবং নির্দিষ্ট ছিল, তবে এটি পুনরাবৃত্তিযোগ্য। কয়েক মাস কেটে গেছে, সুতরাং আমি আর কোনও অধিকার দিতে পারব না।
পোজো-লোক

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