2010-03-19 27 views
10

क्या यह जांचने के लिए एक (अधिक या कम) मानक तरीका है कि न केवल mytable नाम की एक तालिका मौजूद है, लेकिन यह भी कि क्या इसकी स्कीमा समान है या नहीं? मैं H2 database के साथ प्रयोग कर रहा हूँ, और"तालिका मौजूद नहीं है यदि मौजूद नहीं है" - स्कीमा को कैसे जांचें?

CREATE TABLE IF NOT EXISTS mytable (....) 

बयान जाहिरा तौर पर केवल table's नाम लिए जाँच करें। यदि दिए गए नाम के साथ एक टेबल है, लेकिन अलग-अलग स्कीमा है तो मुझे अपवाद प्राप्त होने की उम्मीद होगी।

+0

"एक समान नाम वाला एक टेबल"? "एक स्कीमा जैसा कि यह होना चाहिए"? समझने के लिए एक सामान्य क्वेरी उपकरण के लिए यह बहुत अस्पष्ट है। – Thilo

+0

+1 क्योंकि मुझे ऐसी सुविधा चाहिए, हालांकि। डेटाबेस द्वारा जरूरी नहीं, बल्कि एक उपकरण/पुस्तकालय में। – Thilo

+0

@ थिलो: इसे "दिए गए नाम के साथ तालिका" माना जाता था, जिसे अभी तय किया गया है। "स्कीमा के समान होने के समान" मेरा मतलब है कि यदि 'mytable' नाम की एक तालिका मौजूद है, तो इसकी स्कीमा क्वेरी के लिए प्रदान की गई समानता के बराबर होनी चाहिए; अन्यथा मैं किसी प्रकार की त्रुटि प्राप्त करना चाहता हूं। यह एक पूरी तरह से परिभाषित क्वेरी है, इसलिए मैं सोच रहा हूं कि (और यदि नहीं, क्यों नहीं) इसे व्यक्त करने का एक तरीका है। असल में मैं हैरान था कि "अगर नहीं है तो" केवल नाम की जांच करता है। –

उत्तर

1

मुझे इस सुविधा को मूल रूप से किसी भी डेटाबेस से अवगत नहीं है।

इसका उपयोग नहीं किया है (ऐसा करने के लिए अपना स्वयं का कोड लुढ़का) लेकिन शायद Apache DdlUtils मदद कर सकता है।

यह करना एक मुश्किल बात है, खासकर यदि आप इसे विभिन्न डेटाबेस विक्रेताओं के साथ काम करना चाहते हैं। इसके अलावा, पास करने के लिए स्कीमा की आवश्यकता के बारे में शायद अलग-अलग राय हैं। कॉलम नाम, कॉलम ऑर्डर, कॉलम प्रकार, प्राथमिक कुंजी परिभाषा: निश्चित रूप से। लेकिन बाधाओं, बाधाओं के नाम, टेबल स्पेस परिभाषाओं आदि के बारे में कैसे?

+0

मैं देखता हूं, यह उतना आसान नहीं हो सकता जितना मैंने सोचा था। फिर भी, यह देखते हुए कि यह एक चेक है कि किसी भी डेटाबेस का उपयोग कर सॉफ्टवेयर का लगभग कोई भी टुकड़ा * करना चाहिए, यह आश्चर्यजनक है कि कोई मानक समाधान नहीं है। –

4

CREATE TABLE IF NOT EXISTS ... मानक SQL कोड नहीं है।

यह करने की बात यह है कि तालिका पहले से ही सूची में है या नहीं। connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

अधिक जानकारी के लिए javadoc java.sql.Connection देखें: उदाहरण के लिए, जावा में आप की तरह कुछ कर सकते हैं।

+0

जो स्कीमा को चेक नहीं करता है, हालांकि (निश्चित रूप से, मेटाडेटा का उपयोग करके, आप इसे स्वयं देख सकते हैं, लेकिन यह थकाऊ है। जेडीबीसी मेटाडाटा में एक भयानक एपीआई है।)। – Thilo

1

दुगना जवाब:

(क) एक मेज के अस्तित्व कुछ है कि एक आवेदन की स्थापना प्रक्रिया के द्वारा सुनिश्चित किया जाना चाहिए, रन-टाइम में आवेदन अपने आप में नहीं है।

(बी) यदि आपको सच में लगता है कि आपके पास (ए) से विचलन करने का वैध कारण है, तो आप कैटलॉग को आजमा सकते हैं और क्वेरी कर सकते हैं, जो डेटाबेस है जिसमें संरचनाएं कम से कम, INFORMATION_SCHEMA द्वारा निर्धारित की गई हैं एसक्यूएल मानक के। कौन सी सारणी मौजूद हैं, उनके पास कौन से कॉलम हैं, कौन से डेटा वे कॉलम हैं, कौन सी चाबियाँ घोषित की जाती हैं आदि। यह सब कुछ है।

+2

कई एप्लिकेशन अपने उपयोगकर्ता को एक अलग इंस्टॉलर/अपडेटर स्क्रिप्ट के साथ परेशान नहीं करना चाहते हैं और आंतरिक रूप से अपनी डेटाबेस योजना का प्रबंधन नहीं करना चाहते हैं।भले ही वे टेबल नहीं बनाते हैं, फिर भी एप्लिकेशन की अखंडता (कुछ समय बाद यादृच्छिक डेटाबेस त्रुटियों में विफल होने के बजाय) स्टार्टअप पर तालिका स्कीमा को जांचना समझ में आता है। मैं यह नहीं कह रहा हूं कि यह दृष्टिकोण हमेशा उपयुक्त है, लेकिन कुछ मामलों में यह एक वैध बात है। – Thilo

+0

हां, मुझे यह भी लगता है कि ए) जाने का सामान्य तरीका हो सकता है, यह कहता है, "सी का अस्तित्व: ड्राइव ऐसा कुछ है जिसे आवेदन की स्थापना प्रक्रिया द्वारा सुनिश्चित किया जाना चाहिए, न कि आवेदन द्वारा खुद रन-टाइम पर। " लेकिन एक गंभीर आवेदन पर्यावरण के बारे में कोई धारणा नहीं करना चाहिए। इसके बजाय, इसे जांचना चाहिए। वातावरण बदल सकते हैं - और जल्दी या बाद में वे करेंगे। –

5
SELECT * 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME  = 'TableName' 
    AND TABLE_SCHEMA = 'public' 
+0

क्या आप विस्तृत कर सकते हैं? यह क्या करता है –

+1

मैं जो कहता हूं वह करता है ... यह जांचता है कि डेटाबेस में ऐसी तालिका मौजूद है या नहीं। 'INFORMATION_SCHEMA' (कुछ हद तक) मानकीकृत है, इसलिए यह कथन अधिकांश डेटाबेस में काम करता है। –

+0

यह एमएसएसक्यूएल में भी काम करता है, लेकिन वहां "डिफ़ॉल्ट" स्कीमा "डीबीओ" है – isapir

संबंधित मुद्दे