PostgreSQL এ কীভাবে টেবিলের ডেটা পরিবর্তন করবেন


14

SELECTপ্রক্রিয়া চলাকালীন কোনও আগত বিবৃতি প্রভাবিত না করে আমি কোনও টেবিলের পুরো বিষয়বস্তু প্রতিস্থাপন করতে চাই ।

ব্যবহারের ক্ষেত্রে এমন একটি টেবিল থাকা উচিত যা মেলবক্সের তথ্য নিয়মিত উত্তোলিত হয় এবং একটি পোস্টগ্র্যাসকিউএল টেবিলের মধ্যে সংরক্ষণ করা দরকার। এমন একটি অ্যাপ্লিকেশন ব্যবহার করে এমন অনেক ক্লায়েন্ট রয়েছে যা নিয়মিতভাবে একই টেবিলটি জিজ্ঞাসা করছে।

সাধারণত, আমি এমন কিছু করতাম (সিউডোকোড ইনকামিং) ...

BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT

কিন্তু দুর্ভাগ্যক্রমে এই প্রক্রিয়া চলাকালীন টেবিলটি পড়া যায় না; সময়টি INSERT INTOসম্পূর্ণ হওয়ার জন্য লাগে । টেবিলটি তালাবন্ধ।

মাইএসকিউএলে, আমি RENAME TABLEএই সমস্যাগুলি এড়াতে তাদের পারমাণবিক আদেশ ব্যবহার করতাম ...

CREATE TABLE table_new LIKE table; 
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;

পোস্টগ্র্রেএসকিউএল এ আমি কীভাবে এটি অর্জন করতে পারি?

এই প্রশ্নের প্রয়োজনে, আপনি ধরে নিতে পারেন আমি বিদেশী কী ব্যবহার করছি না।


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

2
@zgguy TRUNCATEকমান্ডটি টেবিলে একটি অ্যাক্সেসএক্সক্লুসিভ লক অর্জন করবে, সুতরাং এই লেনদেনটি সীমাবদ্ধ না করা বা ফিরিয়ে না দেওয়া পর্যন্ত অন্য কেউ টেবিল থেকে পড়তে পারবেন না।
জোশ কুপারশ্মিডিট

2
আপনি যদি এর deleteপরিবর্তে ব্যবহার করেন truncateতবে ধীর হবে তবে পাঠকদের অবরুদ্ধ না করে। আপনার কতটি সারি মুছতে হবে?
a_horse_with_no_name

@a_horse_with_no_name সাধারণত 200-0000 সারি এর মধ্যে অনেকগুলি ভার্চর কলাম সহ ows এর অপেক্ষার সময় DELETEএবং INSERTউপায় খুব দীর্ঘ হবে।
ক্লার্কি

উত্তর:


21

ঠিক আছে, আপনি যে TRUNCATE TABLE কমান্ডটি সম্পাদন করছেন ... এটি প্রতিটি টেবিলটিতে এটি চালিত একটি অ্যাক্সেস এক্সক্লুসিভ লক অর্জন করে ", সুতরাং আপনার পোস্ট করা প্রথম এসকিউএল ব্লকে সেই সময়ের পরে টেবিলটি অ্যাক্সেস করার চেষ্টা করা অন্য কোনও ক্লায়েন্ট আপনার INSERTসমাপ্ত না হওয়া অবরুদ্ধ হয়ে থাকবে এবং আপনি COMMIT

আপনি আপনার মাইএসকিউএল-নির্দিষ্ট কোডের মতো একই কাজটি ব্যবহার করতে পারেন; পোস্টগ্রিস মোটামুটি একই বাক্য গঠন সমর্থন করে এবং একই রকম লকিং আচরণ করবে have বুদ্ধিমান:

BEGIN;
-- You probably want to make sure that no one else is
-- INSERT / UPDATE / DELETE'ing from the original table, otherwise
-- those changes may be lost during this switchover process. One way
-- to do that would be via:
-- LOCK TABLE "table" IN SHARE ROW EXCLUSIVE mode;
CREATE TABLE "table_new" (LIKE "table");
INSERT INTO "table_new" ...;

-- The ALTER TABLE ... RENAME TO command takes an Access Exclusive lock on "table",
-- but these final few statements should be fast.
ALTER TABLE "table" RENAME TO "table_old";
ALTER TABLE "table_new" RENAME TO "table";
DROP TABLE "table_old";

COMMIT;

অতিরিক্ত বোনাস: পোস্টগ্রিস আসলে মাইএসকিউএল এর বিপরীতে লেনদেনের ডিডিএল সমর্থন করে, সুতরাং যদি আপনাকে উপরের লেনদেনটি রোলব্যাক করতে হয় তবে আপনি নিরাপদে এটি করতে পারেন।


আমি এই সম্পর্কে কিছু পরীক্ষা করতে যাচ্ছি, আপনার উত্তরের জন্য ধন্যবাদ। LOCK TABLEআপনার প্রস্তাবিত পদ্ধতিটি যদি আমি ব্যবহার করি তবে আমার কি এটির আগে আবার আনলক করা দরকার COMMIT, না এটি নিজেই আনলক হবে?
ক্লার্কি

1
সম্পাদনা: এই ডকুমেন্টেশনে নিম্নলিখিত বিবরণীটি পেয়েছে : "আনলক টেবল কমান্ড নেই; লেনদেনের শেষে সর্বদা লকগুলি প্রকাশ করা হয়।"
ক্লারকি

2
এখানে একটি জিনিস অনুপস্থিত যা সংযুক্তিগুলির সাথে এখনও সংযুক্তিগুলির মধ্যে রয়েছে_old
ইন্টেলিক্স

@ ইন্টেলিক্স আপনি কি এটি বিস্তারিত বলতে পারবেন? মানে কি এই যে সীমাবদ্ধতা কেবল করছে নামে পুরাতন টেবিল প্রতি বা যে তারা কেবল থাকা পুরাতন টেবিলে (যার অর্থ সীমাবদ্ধতার কার্যকরভাবে বাদ করা হয়)?
maerics

সারণী তৈরির আগে মন্তব্যটি ( -- LOCK TABLE "table" IN ROW EXCLUSIVE mode;) স্পেস অনুসারে উত্স টেবিলটিতে আপডেট / সন্নিবেশ থেকে সুরক্ষিত করা অপ্রয়োজনীয় বলে মনে হচ্ছে। দুটি ROW EXCLUSIVEলক বিনা দ্বন্দ্ব ছাড়াই অধিগ্রহণ করা যেতে পারে ( postgresql.org/docs/10/expানী-locking.html# LOCKING- TABLES এ টেবিল 13.2 দেখুন )। ডেটা আপডেটগুলি রোধ করতে আপনার কমপক্ষে একটি SHAREলক থাকা দরকার।
পিলু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.