यदि टेबल ड्रॉप टेबल मौजूद है तो इसे बनाएं, अगर यह मौजूद नहीं है तो इसे बनाएं


151

मैं स्तब्ध हूँ, मुझे नहीं पता कि यह कैसे करना है।

मूल रूप से मैं सिर्फ एक तालिका बनाना चाहता हूं, लेकिन अगर यह मौजूद है तो इसे गिराया जाना चाहिए और फिर से बनाया जाना चाहिए, न कि काट दिया जाना चाहिए, लेकिन अगर यह मौजूद नहीं है तो इसे बनाएं।

क्या कोई मदद कर पाएगा?

धन्यवाद, जॉर्ज


@ शोमोज़, यही तो वे चाहते थे। फिर भी इस सवाल का अस्तित्व और इस पृष्ठ के 20k विचारों से यह साबित होता है कि यह अंग्रेजी को ग्रीक में परिवर्तित करने जितना आसान है।
पचेरियर

2
@ स्पेसर अधिक सहमत नहीं हो सकता है διαγραφή πίνακα, εφόσον υπάρχει:।
शोमज

@ शोमज़, एक व्याकरण त्रुटि है।
पैशियर

जवाबों:


298

बस DROP TABLE IF EXISTS `tablename`;अपने CREATE TABLEबयान से पहले रखा ।

यदि यह मौजूद है तो यह स्टेटमेंट टेबल को ड्राप कर देता है लेकिन अगर यह नहीं होता है तो कोई एरर फेकेगा नहीं।


1
धन्यवाद! यह तालिकाओं या विचारों की सूची के लिए भी काम करता है! DROP TABLE IF EXISTS 'table1', 'table2';और DROP VIEW IF EXISTS 'view1', 'view2';PS- आप किस डायन विद्या का उपयोग करते हैं `इनलाइन कोड!
कैम्पबेलन

2
@Campbeln कोड सेगमेंट से पहले और बाद में सिर्फ बैकटिक्स को दोगुना करें। सिंगल बैकटिक्स को तब शब्दशः दिखाया जाता है।
r3mainer 19

43

बस उपयोग करें DROP TABLE IF EXISTS:

DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );

यदि आपको कोई अन्य समस्या है, तो पहले MySQL प्रलेखन को खोजने का प्रयास करें ।


8

खैर ... हुह। वर्षों तक किसी ने एक सूक्ष्म बात का उल्लेख नहीं किया।

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, जो पहले से ही विषय की समस्या की परवाह करता है और यह ठीक है।


1

मुझे एक तालिका को छोड़ने और एक दृश्य से डेटा के साथ फिर से बनाने की आवश्यकता थी। मैं एक दृश्य से एक तालिका बना रहा था और यही मैंने किया:

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

ऊपर ने मेरे लिए MySQL MariaDb का उपयोग करके काम किया।


ड्रॉप टेबल table_name; दृश्य से चयन * के रूप में तालिका बनाएँ;
sirskoy

यदि आप MariaDB (MySQL में इसकी कमी है), तो आप बसCREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
एलेक्स ऑफशोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.