मैं SELECTप्रक्रिया के दौरान किसी भी आने वाले बयान को प्रभावित किए बिना, तालिका की संपूर्ण सामग्री को प्रतिस्थापित करना चाहता हूं ।
उपयोग के मामले में एक मेज है जो मेलबॉक्स जानकारी संग्रहीत करती है जो नियमित रूप से निकाली जाती है, और पोस्टग्रेसीक्यूएल तालिका में संग्रहीत करने की आवश्यकता होती है। कई क्लाइंट ऐसे एप्लिकेशन का उपयोग कर रहे हैं जो लगातार उसी टेबल को क्वेरी कर रहे हैं।
आम तौर पर, मैं कुछ ऐसा करूंगा (आने वाला स्यूडोकोड) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
लेकिन दुर्भाग्य से इस प्रक्रिया के दौरान तालिका को पढ़ा नहीं जा सकता है; समय INSERT INTOपूरा होने में समय लगता है। मेज पर ताला लगा है।
MySQL में, मैंने 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;
मैं PostgreSQL में इसे कैसे हासिल कर सकता हूं?
इस प्रश्न के प्रयोजनों के लिए, आप मान सकते हैं कि मैं विदेशी कुंजियों का उपयोग नहीं कर रहा हूँ।
TRUNCATEकमांड टेबल पर एक AccessExclusive लॉक का अधिग्रहण करेगी, इसलिए कोई भी टेबल से तब तक नहीं पढ़ पाएगा जब तक कि लेन-देन शुरू नहीं हो जाता या वापस रोल नहीं किया जाता।
deleteइसके बजाय उपयोग करते हैं तो truncateयह धीमा होगा, लेकिन पाठकों को अवरुद्ध किए बिना। आपको हटाने के लिए कितनी पंक्तियों की आवश्यकता है?
DELETEऔर INSERTरास्ता बहुत लंबा हो जाएगा।