অন্য টেবিল থেকে সমস্ত কলাম আপডেট করুন


13

আমাকে অন্য একটি থেকে একটি টেবিল আপডেট করতে হবে এবং আমার সমস্ত কলামগুলি আপডেট করা দরকার। ধারাটিতে প্রতিটি কলাম তালিকাভুক্ত SETকরার সাথে সাথে সেগুলি একবারে আপডেট করার কোনও উপায় আছে কি? এটার মত:

update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id

আমি পিএসকিএল চেষ্টা করেছি, এটি কাজ করে না। আমাকে প্রতিটি কলামের মতো তালিকা তৈরি করতে হবে:

update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id

tableBব্যবহার তৈরি হয় create .. like tableA। সুতরাং তারা মূলত অভিন্ন। এবং আমি এটি করার কারণটি হ'ল আমাকে একটি টেম্প টেবিলটিতে .csv ডেটা লোড করতে হবে tableBএবং তারপরে tableAনতুন ডেটার ভিত্তিতে আপডেট করতে হবে tableBtableAযথাসম্ভব অল্প লক করা tableAদরকার এবং সততা বজায় রাখা দরকার। আমি নিশ্চিত না 'মুছে ফেলুন তবে সন্নিবেশ করান' একটি ভাল বিকল্প হবে?


1
আমি আপনার দ্বিতীয় কোড দিয়ে পরীক্ষা করেছি, এটি কার্যকর! আপনার দুটি বিষয় পর্যালোচনা করা উচিত: dba.stackexchange.com/questions/58371/… , dba.stackexchange.com/questions/59458/…
লুয়ান হুইন

উত্তর:


12

নেই কোন সিনট্যাক্স বৈকল্পিক আপনি একসাথে পুরো সারি আপডেট করতে দেয়। তবে, আপনার এখন পর্যন্ত যা আছে তার চেয়ে একটি ছোট ফর্ম রয়েছে।

এছাড়াও, আপনি আসলে সমস্ত কলামগুলি আপডেট করতে চান না। WHEREঅন্তত একটি কলাম (নিচে আইডি পিন শর্ত id) অপরিবর্তিত থাকা। তবে এটি কেবল নিটপিকিং।

UPDATE table_a a
SET    (  c1,   c2, ...)
     = (b.c1, b.c2, ...)
FROM   table_b b
WHERE  a.id = b.id;

সম্পর্কিত সম্পর্কিত আরও বিশদ:
সমস্ত কলামের বাল্ক আপডেট

DELETE / INSERT

অভ্যন্তরীণভাবে, পোস্টগ্রিসের এমভিসিসি মডেলের কারণে , প্রতিটি UPDATEকার্যকরভাবে যে কোনও উপায়ে একটি নতুন সারি প্রবেশ করায় এবং পুরানোটিকে অপ্রচলিত হিসাবে চিহ্নিত করে marks সুতরাং, পর্দার পিছনে UPDATEএবং DELETEপ্লাসের মধ্যে খুব বেশি পার্থক্য নেই INSERT
আছে কিছু পক্ষে বিস্তারিত UPDATEরুট:

  • গরম আপডেট।
  • টোস্ট সারণী: আপনার কাছে বড় কলাম রয়েছে তবে সামগ্রীটি সংরক্ষণ করা যেতে পারে TO টস্ট টেবিলগুলিতে "আউট অফ-লাইন" এবং টাসটেড কলামগুলি অপরিবর্তিত থাকলে টস টেবিলের মধ্যে নতুন সারি সংস্করণ একই সারিটিতে লিঙ্ক করতে পারে।
  • সূচকের রক্ষণাবেক্ষণ আপডেটের জন্য সস্তা হতে পারে।

অন্যথায়, লকিংয়ের সমান হওয়া উচিত। ক্ষতিগ্রস্ত সারিগুলিতে আপনার কোনও একচেটিয়া লক প্রয়োজন। কেবল তাড়াতাড়ি করে দিন।
যদি আপনি বিশাল সংখ্যক সারি নিয়ে কাজ করে থাকেন এবং আপনার একটি সামঞ্জস্যপূর্ণ রাষ্ট্রের প্রয়োজন নেই (সমস্ত সারি বা কোনও নয়), আপনি ক্রিয়াকলাপটিকে একাধিক ব্যাচে বিভক্ত করতে পারেন। (পৃথক লেনদেন!) মোট ব্যয় বৃদ্ধি করে, তবে প্রতি সারিতে লক সময়কে কম রাখে।


3
DELETE / INSERTএর চেয়ে অযাচিত বা কেবল ভিন্ন (ক্যাসকেড বা ট্রিগারযুক্ত) প্রভাব থাকতে পারে UPDATE
ypercubeᵀᴹ

এটি সঠিক তবে আপনার টেবিল_এর উপাধি আপডেট করা উচিত। টেবিল_এ (যা আপডেট হওয়া টেবিল) কোনও উপাধি পেতে পারে না।
ঠিক অন্য কোড প্রেমিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.