खैर ... हुह। वर्षों तक किसी ने एक सूक्ष्म बात का उल्लेख नहीं किया।
DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );
उचित प्रतीत होने के बावजूद , यह एक ऐसी स्थिति की ओर जाता है जब पुरानी तालिका पहले से ही चली गई है और नया अभी तक नहीं बनाया गया है: कुछ ग्राहक इस समय विषय तालिका तक पहुंचने का प्रयास कर सकते हैं।
बेहतर तरीका यह है कि ब्रांड की नई तालिका बनाई जाए और उसे पुराने के साथ स्वैप किया जाए (तालिका सामग्री खो गई है):
CREATE TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
- आपको परिणाम की जांच करनी चाहिए
CREATE ...
और त्रुटि के मामले में जारी नहीं रखना चाहिए , क्योंकि विफलता का मतलब है कि अन्य थ्रेड ने एक ही स्क्रिप्ट को पूरा नहीं किया: या तो क्योंकि यह बीच में दुर्घटनाग्रस्त हो गया या अभी तक खत्म नहीं हुआ - यह एक अच्छा विचार है अपने आप से चीजों का निरीक्षण करें।
- फिर, आपको पहले के परिणाम की जांच करनी चाहिए
RENAME ...
और सफलता के मामले में जारी नहीं रखना चाहिए : पूरा ऑपरेशन सफलतापूर्वक पूरा हो गया है; इससे भी अधिक, RENAME ...
यदि कोई दूसरा धागा पहले से ही एक ही क्रम शुरू कर चुका है, तो यह (और वसीयत) असुरक्षित हो सकता है (इस मामले को कवर न करने से बेहतर है, नीचे लॉकिंग नोट देखें)।
- दूसरा
RENAME ...
एटोमिकली टेबल की परिभाषा को बदल देता है,
विवरण के लिए
MySQL मैनुअल को देखें।
- अंत में,
DROP ...
बस पुरानी तालिका को साफ करता है, जाहिर है।
सभी बयानों को कुछ इस तरह से लपेटने से SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');
बिना त्रुटि जाँच के सभी बयानों को क्रमिक रूप से लागू करने की अनुमति मिलती है, लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार है: MySQL में जटिलता बढ़ जाती है और लॉकिंग फ़ंक्शन स्टेटमेंट प्रतिकृति के लिए सुरक्षित नहीं हैं।
यदि टेबल डेटा को टेबल डेफिनिशन अपग्रेड से बचना चाहिए ... तो सामान्य स्थिति के लिए यह मतभेदों का पता लगाने और उचित ALTER ...
कथन का उत्पादन करने के लिए तालिका परिभाषाओं की तुलना करने के बारे में कहीं अधिक जटिल कहानी है , जो कि स्वचालित रूप से संभव नहीं है, उदाहरण के लिए जब कॉलम का नाम बदला जाता है।
साइड नोट 1:
आप एक ही दृष्टिकोण का उपयोग कर देखा गया, इस मामले में साथ सौदा कर सकते हैं CREATE/DROP TABLE
केवल करने के लिए बदल देती है CREATE/DROP VIEW
, जबकि RENAME TABLE
अवशेष अपरिवर्तित। वास्तव में आप तालिका को दृश्य में बदल सकते हैं और इसके विपरीत।
CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;
साइड नोट 2:
मारियाडीबी उपयोगकर्ताओं को खुश होना चाहिए CREATE OR REPLACE TABLE/VIEW
, जो पहले से ही विषय की समस्या की परवाह करता है और यह ठीक है।