INSERT INTO vs SELECT INTO


127

उपयोग करने के बीच अंतर क्या है

SELECT ... INTO MyTable FROM...

तथा

INSERT INTO MyTable (...)
SELECT ... FROM ....

?

BOL [ INSERT , SELECT ... INTO ] से, मुझे पता है कि SELECT ... INTO का उपयोग डिफ़ॉल्ट फ़ाइल समूह पर सम्मिलन तालिका बनाएगा यदि यह पहले से मौजूद नहीं है, और इस कथन के लिए लॉगिंग पुनर्प्राप्ति पर निर्भर करता है डेटाबेस का मॉडल।

  1. कौन सा कथन बेहतर है?
  2. क्या अन्य प्रदर्शन निहितार्थ हैं?
  3. चयन के लिए एक अच्छा उपयोग मामला क्या है ... INSERT INTO पर ...?

संपादित करें: मैंने पहले ही कहा था कि मुझे पता है कि SELECT INTO ... एक तालिका बनाता है जहां यह मौजूद नहीं है। जो मैं जानना चाहता हूं कि एसक्यूएल में एक कारण के लिए यह कथन शामिल है, यह क्या है? यह डालने पंक्तियों के लिए पर्दे के पीछे कुछ अलग कर रही है, या यह एक के ऊपर बस वाक्यात्मक चीनी है CREATE TABLEऔर INSERT INTO


एक छोटा कारक: INSERT INTOदो प्रमुख शब्द हैं (चयन करें और ठीक करें) सामने की तरफ दें, जो यह बताता है कि यह कोई साधारण एसक्यूएल स्टेटमेंट नहीं है, जबकि SELECT ... INTOकम से कम, साधारण एसक्यूएल स्टेटमेंट जैसा दिखने के लिए शुरू होता है। पूर्व के पक्ष में एक छोटा सा कारण।
मार्टिन एफ

जवाबों:


122
  1. वे अलग-अलग काम करते हैं। INSERTतालिका मौजूद होने पर उपयोग करें । SELECT INTOजब ऐसा न हो तो उपयोग करें ।

  2. हाँ। INSERTआम तौर पर कोई तालिका संकेत नहीं होता है। SELECT INTOउचित तरीके से चिह्नित झंडे सेट कर रहे हैं मान लिया गया है।

  3. मेरे अनुभव SELECT INTOमें आमतौर पर इंटरमीडिएट डेटा सेट के साथ, #tempतालिकाओं की तरह , या बैकअप के लिए संपूर्ण तालिका को कॉपी करने के लिए उपयोग किया जाता है । INSERT INTOका उपयोग तब किया जाता है जब आप किसी ज्ञात संरचना के साथ मौजूदा तालिका में सम्मिलित होते हैं।

संपादित करें

आपके संपादन को संबोधित करने के लिए, वे अलग-अलग काम करते हैं। यदि आप एक तालिका बना रहे हैं और संरचना के उपयोग को परिभाषित करना चाहते हैं CREATE TABLEऔर INSERT। एक समस्या का उदाहरण जो बनाया जा सकता है: आपके पास एक छोटी सी मेज है जिसमें एक वर्चर फ़ील्ड है। आपकी मेज की सबसे बड़ी स्ट्रिंग अब 12 बाइट्स है। आपके वास्तविक डेटा सेट को 200 बाइट तक की आवश्यकता होगी। यदि आप SELECT INTOएक नया बनाने के लिए अपनी छोटी मेज से करते हैं, तो बाद INSERTमें ट्रंकेशन त्रुटि के साथ विफल हो जाएगा क्योंकि आपके क्षेत्र बहुत छोटे हैं।


4
मेरे दो सेंट, मुझे लगता है कि असफलता का परिचय देना अच्छी बात है। मैं जानना चाहता हूं कि क्या मेरा डेटा मेरे अपेक्षित डेटा प्रारूप / आकार से मेल नहीं खाता है। मैं हमेशा अपनी तालिका का उपयोग करके परिभाषित करने की कोशिश करता हूं CREATE TABLEऔर INSERT INTOइसके अलावा, यह SELECTसम्मिलित करना निष्पादित किए बिना, अपने आप से कथन का परीक्षण करना आसान है ।
डग चैंबरलेन 20

1
@ डग - मैं सहमत हूँ। मैं लगभग विशेष रूप SELECT INTOसे एक अस्थायी तालिका बनाने के लिए या किसी मौजूदा तालिका का त्वरित बैकअप करने के लिए उपयोग करता हूं, जिसके साथ मैं बंदर करने जा रहा हूं।
JNK

1
@JNK - BOL से, SELECT INTO एक तालिका बनाता है जिसमें चयनित सूची में कॉलम के डेटा प्रकारों के आधार पर एक संरचना होती है। तो आपके उदाहरण में आप वर्चुअर को स्पष्ट रूप से उस आकार में आकार देकर स्थिति को सुधार सकते हैं जो पर्याप्त होगा। सही बात?
jowenece 20

2
@ जॉनी - हां मैं ऐसी ही उम्मीद करता हूं। अगर मैं उस परेशानी में जा रहा हूं तो मैं आगे जाऊंगा और एक CREATEबयान का उपयोग करूंगा ।
JNK

24
  1. कौन सा कथन बेहतर है? निर्भर करता है कि आप क्या कर रहे हैं।

  2. क्या अन्य प्रदर्शन निहितार्थ हैं? यदि तालिका एक स्थायी तालिका है, तो आप तालिका निर्माण के समय अनुक्रमित बना सकते हैं जिसमें नकारात्मक और सकारात्मक दोनों तरह के प्रदर्शन के निहितार्थ हैं। वर्तमान तालिकाओं पर मौजूद अनुक्रमणिकाओं को फिर से बनाएँ नहीं है और इस प्रकार तालिका का बाद का उपयोग धीमा हो सकता है जो कि इसकी आवश्यकता है।

  3. SELECT ... INOERT INSERT INTO ... के लिए एक अच्छा उपयोग मामला क्या है ...? यदि आप तालिका संरचना को पहले से नहीं जानते हैं तो चयन करें का उपयोग किया जाता है। इसे बनाने की मेज और डालने के बयान की तुलना में तेजी से लिखना है, इसलिए इसका उपयोग कई बार तेज गति से करने के लिए किया जाता है। जब आप चीजों का परीक्षण करने के लिए एक त्वरित अस्थायी तालिका बना रहे हों या किसी विशिष्ट क्वेरी की बैकअप तालिका (शायद आपके द्वारा हटाए जा रहे रिकॉर्ड हो) का उपयोग करना अक्सर तेज़ होता है। इसे उत्पादन कोड में उपयोग करने के लिए दुर्लभ होना चाहिए जो कई बार चलेगा (अस्थायी तालिकाओं को छोड़कर) क्योंकि यह विफल हो जाएगा यदि तालिका पहले से ही अस्तित्व में थी।

यह कभी-कभी अनुचित तरीके से उन लोगों द्वारा उपयोग किया जाता है जो नहीं जानते कि वे क्या कर रहे हैं। और वे परिणामस्वरूप db में कहर पैदा कर सकते हैं। मुझे दृढ़ता से लगता है कि एक फेंकने की मेज (एक अस्थायी बैकअप, एक अस्थायी तालिका जो संग्रहित खरीद के अंत में दूर जाएगी, आदि) के अलावा किसी भी चीज़ के लिए SELECT INTO का उपयोग करना अनुचित है।) स्थायी तालिकाओं को उनके डिजाइन के रूप में वास्तविक विचार की आवश्यकता होती है और SELECT INTO यह आसान बनाता है कि किसी भी चीज के बारे में सोचने से बचना आसान है जैसे कि क्या कॉलम और क्या डेटाटिप्स।

सामान्य तौर पर, मैं क्रिएट टेबल और इंसर्ट स्टेटमेंट के उपयोग को प्राथमिकता देता हूं - आपके पास अधिक नियंत्रण हैं और यह दोहराने योग्य प्रक्रियाओं के लिए बेहतर है। इसके अलावा, यदि तालिका एक स्थायी तालिका है, तो इसे एक अलग से बनाएँ तालिका स्क्रिप्ट से बनाया जाना चाहिए (एक जो स्रोत नियंत्रण में है) जैसा कि स्थायी ऑब्जेक्ट्स बनाने के लिए नहीं होना चाहिए, सामान्य रूप से, कोड में सम्मिलित / हटा / अपडेट या एक से चयन होता है तालिका। ऑब्जेक्ट परिवर्तनों को डेटा परिवर्तनों से अलग से संभाला जाना चाहिए क्योंकि वस्तुओं में एक विशिष्ट सम्मिलित / अद्यतन / चयन / हटाने की आवश्यकता से परे निहितार्थ हैं। आपको सबसे अच्छे डेटा प्रकारों पर विचार करने की आवश्यकता है, एफके बाधाओं, पीके और अन्य बाधाओं के बारे में सोचें, ऑडिटिंग आवश्यकताओं पर विचार करें, इंडेक्सिंग के बारे में सोचें, आदि।


5

प्राथमिक अंतर यह है कि SELECT INTO MyTable परिणामों के साथ MyTable नामक एक नई तालिका बनाएगा, जबकि INSERT INTO के लिए यह आवश्यक है कि MyTable पहले से मौजूद है।

आप केवल उस स्थिति में SELECT INTO का उपयोग करेंगे जहां तालिका मौजूद नहीं थी और आप इसे अपनी क्वेरी के परिणामों के आधार पर बनाना चाहते थे। जैसे, ये दोनों कथन वास्तव में तुलनीय नहीं हैं। वे बहुत अलग चीजें करते हैं।

सामान्य तौर पर, SELECT INTO का उपयोग एक बंद कार्यों के लिए अधिक बार किया जाता है, जबकि INSERT INTO का उपयोग नियमित रूप से तालिकाओं में पंक्तियों को जोड़ने के लिए किया जाता है।

संपादित करें:
जब आप SELECT INTO करता है, तो यह सुनिश्चित करने के लिए कि आप पहले से टेबल की परिभाषा नहीं जानते हैं, का चयन करने के लिए CREATE TABLE और INSERT INTO का उपयोग कर सकते हैं। SELECT INTO को संभवतः SQL में शामिल किया गया है क्योंकि यह तदर्थ रिपोर्टिंग या तालिकाओं की नकल करने जैसे कार्यों को बहुत आसान बना देता है।


रचनात्मक तालिका और चयन INTO एक ही बात कर रहे हैं (क्या चयन INTO करता है इसके अलावा में INSERT INTO की आवश्यकता नहीं है) और SELECT INTO की सिफारिश नहीं है मुझे लगता है। Dba.stackexchange.com/questions/156105/… देखें ।
रिक

4

प्रत्येक कथन का एक अलग उपयोग मामला है। वे विनिमेय नहीं हैं।

SELECT...INTO MyTable...एक नया बनाता है MyTableजहां एक पहले मौजूद नहीं था।

INSERT INTO MyTable...SELECT...MyTableपहले से मौजूद होने पर उपयोग किया जाता है।


4
आपने मेरे किसी भी प्रश्न का उत्तर नहीं दिया और मैंने पहले ही आपका उत्तर बता दिया।
जवनी

5
आपके सवालों के जवाब निहित हैं। इसे स्पष्ट करने के लिए, कोई "बेहतर" कथन नहीं है क्योंकि प्रत्येक का अलग उपयोग मामला है। बयान विनिमेय नहीं हैं। जब आप एक नई तालिका बनाना चाहते हैं जो पहले संस्करण का उपयोग न करें। जब तालिका पहले से मौजूद है तो दूसरे संस्करण का उपयोग करें।
जो स्टेफानेली

2
मैं ऐसा क्यों करना चाहूंगा? बनाम एक टेम्‍परेचर टेबल बनाना और फिर उसमें इंसर्ट करना। क्या कोई फायदा है?
जौनेसी

4

वास्तव में चयन करें ... INTO न केवल तालिका बनाता है, बल्कि यदि यह पहले से मौजूद है, तो विफल हो जाएगा, इसलिए मूल रूप से केवल एक ही बार आप इसका उपयोग करेंगे, जब आप जिस तालिका में सम्मिलित कर रहे हैं वह मौजूद नहीं है।

आपके EDIT के संबंध में:

मैं व्यक्तिगत रूप से मुख्य रूप से SELECT ... का उपयोग करता हूं जब मैं एक अस्थायी तालिका बना रहा हूं। यह मेरे लिए मुख्य उपयोग है। हालाँकि, मैं अन्य तालिकाओं के समान संरचनाओं के साथ कई स्तंभों के साथ नए तालिकाओं को बनाते समय भी इसका उपयोग करता हूं और फिर समय बचाने के लिए इसे संपादित करता हूं।


1
मैं मुख्य रूप से अस्थायी तालिकाओं के लिए SELECT..INTO के उपयोगों को देखता हूं, लेकिन क्या कोई कारण यह है कि क्रिएट टेबल स्टेटमेंट के साथ एक टेम्प टेबल बनाना पसंद करते हैं? जैसे - प्रदर्शन लाभ?
जौनेसी

3
@jowenece मुझे लगता है कि मुख्य रूप से सादगी के लिए ... यह भी कहें कि आपके पास एक गतिशील क्वेरी है। मुझे पता है कि आप संरचना नहीं जानते हैं, आप हाथ से पहले तालिका नहीं बना सकते हैं, और इसका उपयोग करने के लिए बहुत आसान है ... खाने की मेज बनाने की तुलना में।
एजेसी

3

सेलेक्ट इन्टो का उपयोग आमतौर पर टेम्प टेबल को उत्पन्न करने के लिए या किसी अन्य टेबल (डेटा और / या स्ट्रक्चर) को कॉपी करने के लिए किया जाता है।

दिन-प्रतिदिन के कोड में आप INSERT का उपयोग करते हैं क्योंकि आपकी तालिकाओं को पढ़ने के लिए पहले से मौजूद होना चाहिए, UPDATEd, DELETEd, JOINed आदि। नोट: INSERT के साथ INTO कीवर्ड वैकल्पिक है

यह है, जब तक कि यह सामान्य रूप से सीमित और विशिष्ट उपयोग की कुछ गुंजाइश के लिए एक अस्थायी तालिका नहीं है, तब तक अनुप्रयोग सामान्य रूप से तालिकाओं को नहीं बनाएंगे और छोड़ेंगे।

SELECT INTO द्वारा बनाई गई तालिका में वास्तविक, स्थायी, पहले से मौजूद तालिका के विपरीत कोई कुंजी या अनुक्रमणिका या बाधा नहीं होगी

2 सीधे तुलनीय नहीं हैं क्योंकि उनके पास उपयोग में लगभग कोई ओवरलैप नहीं है


2

मैं केवल उस प्रश्न के दूसरे बिंदु को कवर करना चाहता हूं जो प्रदर्शन से संबंधित है, क्योंकि किसी अन्य निकाय ने इसे कवर नहीं किया है। जब बड़े डेटासेट के साथ तालिकाओं की बात आती है, तो चयन में सम्मिलित करने की तुलना में बहुत अधिक तेज़ होता है। मुझे पसंद है जब मुझे एक बहुत बड़ी तालिका पढ़नी है। तालिका में 10 मिलियन पंक्तियों के साथ सम्मिलित होने में घंटों लग सकते हैं, जबकि चयन मिनटों में ऐसा करेगा, और नई तालिका पर अनुक्रमणिका खोने के रूप में आप क्वेरी द्वारा अनुक्रमणिका को फिर से बना सकते हैं और अभी भी तुलना में बहुत अधिक समय बचा सकते हैं। में डालें।


यह सच है, लेकिन यह ज्यादातर इसलिए है क्योंकि SQL सर्वर जानता है कि गंतव्य तालिका के लिए कोई विवाद नहीं है। प्रदर्शन का प्रदर्शन insert into #temp with(tablock) select * from ..लगभग उसी तरह हैselect * into #temp from ...
ब्रायन

1

उस समय आपके लिए नई तालिका बनाता है और उसके बाद स्रोत तालिका से रिकॉर्ड सम्मिलित करें। नई बनाई गई तालिका में स्रोत तालिका के समान संरचना है। यदि आप मौजूदा तालिका के लिए चयन करने का उपयोग करने का प्रयास करते हैं तो यह एक त्रुटि उत्पन्न करेगा, क्योंकि यह उसी नाम से नई तालिका बनाने का प्रयास करेगा। सम्मिलित करने के लिए तालिका को आपके डेटाबेस में मौजूद होना चाहिए इससे पहले कि आप इसमें पंक्तियाँ डालें।


1

इन्टो और इंसर्ट में चुनिंदा के बीच का साधारण अंतर है: -> इन्टु इन सलेक्ट को मौजूदा टेबल की आवश्यकता नहीं है। यदि आप तालिका A डेटा की प्रतिलिपि बनाना चाहते हैं, तो आप A. से * INTO [tablename] टाइप करें। यहाँ पर, tablename मौजूदा तालिका हो सकती है या नई तालिका बनाई जाएगी, जिसमें तालिका A जैसी संरचना है।

-> इंसर्ट में मौजूदा टेबल की जरूरत होती है। INSERT INTO [tablename] SELECT * FROM A -; यहां टैबलेनम एक मौजूदा तालिका है।

चुनिंदा में विशेष रूप से बैकअप डेटा को कॉपी करने के लिए आमतौर पर अधिक लोकप्रिय होता है।

आप अपनी आवश्यकता के अनुसार उपयोग कर सकते हैं, यह पूरी तरह से डेवलपर की पसंद है जिसका उपयोग उसके परिदृश्य में किया जाना चाहिए।

प्रदर्शन वार इंसो तेज है।

संदर्भ:

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp


-2

बड़े डेटासेट के लिए चयन केवल एकल उपयोगकर्ता के लिए अच्छा हो सकता है जो बल्क ऑपरेशन कार्य करने वाले डेटाबेस के लिए एक ही कनेक्शन का उपयोग करता है। मैं उपयोग करने की सलाह नहीं देता

SELECT * INTO table

चूंकि यह एक बड़ा लेनदेन बनाता है और ऑब्जेक्ट को बनाने के लिए स्कीमा लॉक बनाता है, जिससे दूसरे उपयोगकर्ता ऑब्जेक्ट को तब तक बना सकते हैं या जब तक SELECT INTOऑपरेशन पूरा नहीं हो जाता है।

अवधारणा के प्रमाण के रूप में 2 सत्र खोलें, पहले सत्र में उपयोग करने का प्रयास करें

select into temp table from a huge table 

और दूसरे खंड में प्रयास करें

create a temp table 

और एक अस्थायी टेबल ऑब्जेक्ट बनाने के लिए ताले, अवरोधन और दूसरे सत्र की अवधि की जांच करें। मेरी सिफारिश यह हमेशा बयान बनाने और सम्मिलित करने के लिए एक अच्छा अभ्यास है और यदि न्यूनतम लॉगिंग उपयोग ट्रेस ध्वज 610 के लिए आवश्यक है।

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