मैं MySQL में टेबल स्वैप कैसे करूँ?


51

मान लीजिए, मेरे पास एक तालिका है foo, जिसमें कुछ आँकड़े हैं जो हर अब और फिर गणना की जाती हैं। इसका उपयोग अन्य प्रश्नों द्वारा किया जाता है।

इसलिए मैं अधिक हाल के आंकड़ों की गणना करना चाहता हूं foo_newऔर गणना तैयार होने पर उन्हें स्वैप करना चाहता हूं ।

मैं कर सकता था

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

लेकिन अगर fooकोई तालिका तालिका न होने पर उन दो पंक्तियों को तालिका में सम्मिलित करने की आवश्यकता हो तो क्या होगा foo? मुझे लगता है कि मुझे इसे किसी तरह से लॉक करना होगा ... या क्या इसे करने का एक और तरीका है?

जवाबों:


79

इस एक आदेश का उपयोग करें:

RENAME TABLE foo TO foo_old, foo_new To foo;

यह एक परमाणु ऑपरेशन है: दोनों तालिकाओं को एक साथ बंद किया जाता है (और बहुत कम समय के लिए), इसलिए कोई भी पहुंच पहले या बाद में होती है RENAME



2
इसके साथ एक समस्या यह है कि, अगर मेरे पास tableXमाता-पिता की अड़चनें हैं foo। इस RENAME के ​​बाद अब इसे संदर्भित किया जाएगा foo_oldलेकिन यदि कोई बाधा नहीं है fooतो आपको ठीक होना चाहिए ...
Marcin Wasiluk

@MarcinWasiluk - अभी तक एक और दोष FOREIGN KEYs
रिक जेम्स

2
यह भी ज्ञात होने के लायक है कि RENAME TABLE को समाप्त होने तक टेबल पर मौजूदा प्रश्नों की प्रतीक्षा करनी होती है। यह ठीक होगा, लेकिन यह भी RENAME के ​​होने की प्रतीक्षा करते हुए अन्य प्रश्नों को बंद कर देगा! यह आपके डेटाबेस तालिकाओं के लिए एक गंभीर लॉकिंग का कारण बन सकता है (यह हमारे लिए है)। यह निर्दोष पर लागू होता है!
जॉन हंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.