चयन में बनाम बनाम बनाने के लिए


16

PostgreSQL का समर्थन करता है CREATE TABLE ASऔर SELECT INTOमैं दोनों का उपयोग कब करता हूं?

CREATE TABLE AS - एक क्वेरी के परिणामों से एक नई तालिका को परिभाषित करें

CREATE TABLE ASएक तालिका बनाता है और इसे एक SELECTकमांड द्वारा गणना किए गए डेटा से भरता है । टेबल कॉलम में आउटपुट कॉलम के नाम और डेटा प्रकार जुड़े होते हैं SELECT(सिवाय इसके कि आप नए कॉलम नामों की स्पष्ट सूची देकर कॉलम नामों को ओवरराइड कर सकते हैं)।

CREATE TABLE ASएक दृश्य बनाने के लिए कुछ समानता है, लेकिन यह वास्तव में काफी अलग है: यह एक नई तालिका बनाता है और नए तालिका को शुरू में भरने के लिए सिर्फ एक बार क्वेरी का मूल्यांकन करता है। नई तालिका क्वेरी के स्रोत तालिकाओं में बाद के परिवर्तनों को ट्रैक नहीं करेगी। इसके विपरीत, एक दृश्य अपने परिभाषित SELECTकथन का पुनर्मूल्यांकन करता है जब भी उसे उद्धृत किया जाता है।

और तब।

SELECT INTO - एक क्वेरी के परिणामों से एक नई तालिका को परिभाषित करें

SELECT INTOएक नई तालिका बनाता है और एक क्वेरी द्वारा गणना की गई डेटा से भरता है। डेटा क्लाइंट को वापस नहीं किया जाता है, क्योंकि यह एक सामान्य के साथ है SELECT। नए टेबल के कॉलम में आउटपुट कॉलम के नाम और डेटा प्रकार होते हैं SELECT

जवाबों:


15

स्पष्टीकरण के बिना, हमेशा CREATE TABLE ASअपवाद के बिना उपयोग करें । प्रत्येक के नीचे नोट के नीचे यह साफ है,

के लिए नोट्स SELECT INTO,

CREATE TABLE ASकार्यात्मक रूप से समान है SELECT INTOCREATE TABLE ASअनुशंसित सिंटैक्स है, क्योंकि यह फॉर्म SELECT INTOECPG या PL / pgSQL में उपलब्ध नहीं है, क्योंकि वे INTO क्लॉज की अलग-अलग व्याख्या करते हैं। इसके अलावा, CREATE TABLE ASप्रदान की कार्यक्षमता का एक सुपरसेट प्रदान करता है SELECT INTO

के लिए नोट्स CREATE TABLE AS,

यह कमांड कार्यात्मक रूप से समान है SELECT INTO, लेकिन इसे पसंद किया जाता है क्योंकि यह सिंटैक्स के अन्य उपयोगों के साथ भ्रमित होने की संभावना कम है SELECT INTOइसके अलावा, CREATE TABLE ASकी पेशकश की कार्यक्षमता का एक सुपरसेट प्रदान करता है SELECT INTO

इसके अलावा , डॉक्स की संगतता अनुभाग में SELECT INTOयह और भी अधिक हो जाता है,

SQL मानक SELECT INTOहोस्ट तालिका के स्केलर चर में मानों का चयन करने के बजाय एक नई तालिका बनाने के लिए उपयोग करता है। यह वास्तव में ECPG (अध्याय 34 देखें) और PL / pgSQL (अध्याय 41 देखें) में पाया गया उपयोग है। तालिका निर्माण का प्रतिनिधित्व करने के SELECT INTOलिए PostgreSQL का उपयोग ऐतिहासिक है। CREATE TABLE ASनए कोड में इस उद्देश्य के लिए उपयोग करना सबसे अच्छा है ।

तो हमारे पास,

  1. PostgreSQL को लगता है कि यह भ्रामक है क्योंकि SELECT INTOसंदर्भों में अन्य सामान केवल PL / pgSQL और ECPG में उपलब्ध है।
  2. CREATE TABLEका समर्थन करता है और अधिक कार्यक्षमता (मुझे लगता है वे की बात कर रहे हैं WITH OIDS, और TABLESPACE, IF NOT EXISTS)।
  3. SELECT INTO टेबल निर्माण के लिए "पदावनत" है।

एक साइड नोट के रूप में, सीटीई के साथ सीटीएएस के लिए वाक्यविन्यास थोड़ा अजीब लग सकता है। , और QUEL's पर किसी प्रकार की पकड़ भी हो SELECT INTO सकती है । QUEL SQL का पूर्ववर्ती था, जो कि पूर्ववर्ती PostgreSQL (INGRES) का उपयोग करता था।RETRIEVE INTO


1

वहाँ एक और बात मैंने देखा है कि स्वीकार किए जाते हैं जवाब से गायब है। उपयोग करने CREATE TABLE ASसे प्रत्येक स्तंभ की अशक्त विशेषता को संरक्षित किया जाता है जिसे नजरअंदाज किया जाता है SELECT INTO

केवल इस आधार पर, मैं सुझाऊंगा CREATE TABLE AS। दोनों कथनों के लिए एक सामान्य उपयोग का मामला एक लंबी चल रही क्वेरी से डेटा को आपकी क्वेरी की अवधि के लिए उस तालिका को लॉक किए बिना तालिका में लोड करना है। आप उपरोक्त आदेशों में से एक का उपयोग करके एक अस्थायी तालिका बनाते हैं, वहां लंबे समय तक चलने वाले क्वेरी परिणामों को डालते हैं, और फिर उन परिणामों को मूल तालिका में सम्मिलित करते हैं। अपने अस्थायी तालिका में अशक्त विशेषता को संरक्षित करने से आपके दूसरे सम्मिलित विफल होने की संभावना कम हो जाती है।

पीजी 11 पर इसका परीक्षण किया गया है, इसलिए शायद इस सवाल का जवाब देने के बाद से एक नई सुविधा।


एक लंबी चलने वाली क्वेरी किसी भी तालिका को लॉक नहीं करती है। तो उस कारण से CTAS का उपयोग करने की प्रेरणा निरर्थक है
a_horse_with_no_name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.