SQL में TRUNCATE और DELETE में क्या अंतर है


303

SQL में TRUNCATEऔर क्या अंतर है DELETE?

यदि आपका उत्तर प्लेटफ़ॉर्म विशिष्ट है, तो कृपया इसका संकेत दें।


4
सभी उत्तर प्लेटफ़ॉर्म-विशिष्ट हैं। मानक SQL में कोई TRUNCATE कमांड नहीं है। यह इसलिए एक स्वामित्व सुविधा है और प्रत्येक DBMS विक्रेता के लिए एक अलग चीज का मतलब है।
nvogel

जवाब बहुत ही कार्यान्वयन विशिष्ट है, क्योंकि यह होना चाहिए, क्योंकि sqlvogel ने बताया, यह एक गैर-मानक कमांड (TRUNCATE) है। या तो इस टैग किए गए 'ओरेकल' को छोड़ दें या इसे एक समुदाय-विकी शैली का उत्तर दें, और प्रत्येक प्रमुख RDBMS (Oracle, MS-MSQL, PostgreSQL सभी के लिए
TRCCATE

यदि लेन-देन किया जाता है, तो इसका मतलब है, तो हम TRUNCATE कमांड को रोलबैक नहीं कर सकते हैं, लेकिन हम अभी भी लॉग फाइल से DELETE कमांड को रोलबैक कर सकते हैं, क्योंकि DELETE लॉग फाइल में उन्हें रिकॉर्ड करता है, अगर भविष्य में लॉग फाइल के साथ रोलबैक करने की आवश्यकता होती है।

जवाबों:


272

यहाँ मतभेदों की एक सूची है। मैंने Oracle-विशिष्ट विशेषताओं पर प्रकाश डाला है, और उम्मीद है कि समुदाय अन्य विक्रेताओं के विशिष्ट अंतर में भी जोड़ सकता है। अधिकांश विक्रेताओं के लिए मतभेद जो सीधे शीर्षकों के नीचे जा सकते हैं, नीचे दिए गए मतभेदों के साथ हो सकते हैं।


सामान्य अवलोकन

यदि आप किसी तालिका से सभी पंक्तियों को जल्दी से हटाना चाहते हैं, और आप वास्तव में यह सुनिश्चित करना चाहते हैं कि आप इसे करना चाहते हैं, और आपके पास तालिकाओं के खिलाफ विदेशी कुंजी नहीं है, तो शायद एक ट्रेंकेट एक DELETE की तुलना में तेज़ होने वाला है ।

विभिन्न प्रणाली-विशिष्ट मुद्दों पर विचार किया जाना चाहिए, जैसा कि नीचे विस्तृत है।


कथन प्रकार

हटाएं DML है, Truncate DDL है ( DDL और DML क्या है? )


कमिट और रोलबैक

विक्रेता द्वारा परिवर्तनीय

एस क्यू एल सर्वर

Truncate को वापस रोल किया जा सकता है।

PostgreSQL

Truncate को वापस रोल किया जा सकता है।

आकाशवाणी

क्योंकि एक TRUNCATE DDL है, इसमें दो कमिटमेंट शामिल हैं, एक पहले और स्टेटमेंट एक्जीक्यूशन के बाद। Truncate इसलिए वापस नहीं लुढ़का जा सकता है, और truncate प्रक्रिया में विफलता ने वैसे भी एक प्रतिबद्धता जारी की है।

हालाँकि, नीचे फ्लैशबैक देखें।


स्पेस रिक्लेमेशन

हटाएं स्थान को पुनर्प्राप्त नहीं करता है, Truncate स्थान को पुनर्प्राप्त करता है

आकाशवाणी

अगर आप REUSE STORAGE क्लॉज का उपयोग करते हैं तो डेटा खंडों को आबंटित नहीं किया जाता है, जो तालिका के डेटा के साथ पुनः लोड किया जाना है, तो यह मामूली रूप से अधिक कुशल हो सकता है। उच्च जल चिह्न रीसेट है।


रो स्कोप

हटाएँ का उपयोग सभी पंक्तियों या पंक्तियों के सबसेट को हटाने के लिए किया जा सकता है। Truncate सभी पंक्तियों को हटा देता है।

आकाशवाणी

जब एक तालिका को विभाजित किया जाता है, तो अलग-अलग विभाजन को अलग-थलग किया जा सकता है, इस प्रकार तालिका के सभी डेटा को आंशिक रूप से हटाया जा सकता है।


वस्तु प्रकार

हटाएं एक क्लस्टर के अंदर तालिकाओं और तालिकाओं पर लागू किया जा सकता है। Truncate केवल तालिकाओं या संपूर्ण क्लस्टर पर लागू होता है। (Oracle विशिष्ट हो सकता है)


डेटा ऑब्जेक्ट पहचान

आकाशवाणी

डिलीट करने से डेटा ऑब्जेक्ट आईडी पर कोई असर नहीं पड़ता है, लेकिन जब तक उसके निर्माण के बाद से टेबल के खिलाफ कोई इंसर्ट नहीं होता है, तब तक ट्रंकट एक नया डेटा ऑब्जेक्ट आईडी असाइन करता है। यहां तक ​​कि एक भी इंसर्ट जो रोल बैक किया गया है, वह ट्रेंक्यूशन पर नई डेटा ऑब्जेक्ट आईडी को असाइन करेगा। ।


फ्लैशबैक (ओरेकल)

फ्लैशबैक डिलीट करने के लिए काम करता है, लेकिन ऑपरेशन से पहले राज्यों को फ्लैशबैक रोकता है।

हालांकि, 11gR2 से FLASHBACK ARCHIVE फीचर इसकी अनुमति देता है, एक्सप्रेस एडिशन को छोड़कर

Oracle में FLASHBACK का उपयोग http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


विशेषाधिकार

परिवर्तनशील

आकाशवाणी

हटाएं किसी अन्य उपयोगकर्ता या भूमिका के लिए एक तालिका पर दी जा सकती हैं, लेकिन किसी भी TABLE अनुदान DROP का उपयोग किए बिना छोटा नहीं हो सकता है।


फिर से करें / पूर्ववत

हटाएं एक छोटी राशि फिर से बनाता है और बड़ी मात्रा में पूर्ववत करता है। Truncate प्रत्येक की एक नगण्य राशि उत्पन्न करता है।


इंडेक्स

आकाशवाणी

एक छोटा ऑपरेशन अनुपयोगी सूचकांक को फिर से प्रयोग करने योग्य बनाता है। हटाएं नहीं।


विदेशी कुंजी

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


टेबल लॉकिंग

आकाशवाणी

Truncate को एक विशेष टेबल लॉक की आवश्यकता होती है, डिलीट के लिए एक साझा टेबल लॉक की आवश्यकता होती है। इसलिए टेबल लॉक को अक्षम करना एक टेबल पर ट्रंकट संचालन को रोकने का एक तरीका है।


ट्रिगर

डीएमएल ट्रिगर एक ट्रंकैट पर फायर नहीं करते हैं।

आकाशवाणी

डीडीएल ट्रिगर उपलब्ध हैं।


दूरस्थ निष्पादन

आकाशवाणी

Truncate एक डेटाबेस लिंक पर जारी नहीं किया जा सकता है।


पहचान कॉलम

एस क्यू एल सर्वर

Truncate IDENTITY स्तंभ प्रकारों के लिए अनुक्रम को रीसेट करता है, हटाता नहीं है।


परिणाम सेट

अधिकांश कार्यान्वयनों में, एक DELETEबयान ग्राहक को उन पंक्तियों पर वापस ला सकता है जिन्हें हटा दिया गया था।

एक Oracle PL / SQL उपप्रोग्राम में जैसे आप कर सकते हैं:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

अपने चौथे कथन को न समझें: यदि मैं कहता हूं कि [ ] तालिका से; तब तक उस तालिका की सभी पंक्तियाँ तब तक हटा दी जाएँगी जब तक कि कोई FK उसे रोक नहीं देता। वैसे, मुझे लगता है कि यह SQL सर्वर-विशिष्ट है, आप FKs के साथ तालिकाओं पर TRUNCATE का उपयोग नहीं कर सकते।
जो पिनेडा

कुछ और टिप्पणियां: मैं आपके तीसरे कथन से असहमत हूं, जब तक कि यह ओरेकल-विशिष्ट न हो। कम से कम एसक्यूएल एस के साथ या तो यदि आप DELETE या TRUNCATE करते हैं तो आप तब तक वसूली नहीं करते हैं (जब तक कि डेटाबेस विशेष रूप से हार्ड ड्राइव पर सिकुड़ न जाए) जब तक आप विशेष रूप से इसके लिए नहीं पूछते।
जो पिनेडा

1
5TH स्टेटमेंट: आप sql 2008 r2 पर एक TRUNCATE टेबल रोलबैक कर सकते हैं
Eric Labashosky

1
Postgresql एक TRUNCATE को रोलबैक कर सकता है और इस तरह से यह स्वतः पूर्ण नहीं होता है।
rfusca

5
DELETE हटाए गए पंक्तियों की संख्या देता है, लेकिन TRUNCATE नहीं करता है। यह बहुत ही मूर्खतापूर्ण बात है लेकिन ध्यान देने योग्य है :)
दीपक कुमार झा

190

ट्रंकट और डिलीट के बीच का अंतर नीचे सूचीबद्ध है:

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+

तालिका की रीसेट रीसेट पहचान का क्या मतलब है? लेकिन, डिलीट के बारे में क्या?
रवि

1
@ जेवर: इसका मतलब है कि जब आप प्राथमिक कुंजी फ़ील्ड के लिए True के लिए पहचान विशिष्टता गुण सेट करते हैं, तो जब आप उस तालिका में डेटा सम्मिलित करते हैं, तो प्राथमिक कुंजी स्तंभ 1,2,3,4,5 जैसे मान रखता है .... (यदि पहचान शुरू होती है 1 से और बीज 1) है, और जब आप टेबल को काटते हैं तो यह सभी पहचान मूल्य खो देगा, इसलिए जब आप उस तालिका में डेटा डालना शुरू करते हैं तो यह 1 से शुरू होगा बजाय इसके कि यह अंतिम कहाँ बचा है। DELETE में, यह रिवर्स है, यह DELETE स्टेटमेंट निष्पादित करने के बाद भी पहचान मूल्य को सुरक्षित रखता है। उपरोक्त छवि में DELETE कॉलम में दूसरी तुलना बिंदु गलती के लिए क्षमा करें।
भौमिक पटेल

लगता है जैसे आप SQL SERVER
Ravi

4
TRUNCATE और DELETE दोनों को SQL SERVER में रोलबैक किया जा सकता है । और दूसरी पंक्ति में DELETE खुराक पहचान को रीसेट नहीं करता है। अब आप इस पोस्ट को कैसे संपादित कर सकते हैं? StackOverflow में चित्रों का उपयोग करने के बारे में यह बुरी बात है।
महमूद जेनमी

2
Truncate को वापस लाया जा रहा है! (एसक्यूएल सर्वर)
आइमल खान

55

ड्रॉप

DROP कमांड डेटाबेस से एक टेबल हटाता है। सभी तालिकाओं की पंक्तियों, अनुक्रमित और विशेषाधिकारों को भी हटा दिया जाएगा। कोई डीएमएल ट्रिगर नहीं किया जाएगा। ऑपरेशन वापस नहीं किया जा सकता है।

TRUNCATE

TRUNCATE एक तालिका से सभी पंक्तियों को निकालता है। ऑपरेशन वापस नहीं किया जा सकता है और कोई ट्रिगर नहीं निकाला जाएगा। जैसे, TRUNCATE तेज़ है और DELETE के रूप में अधिक पूर्ववत स्थान का उपयोग नहीं करता है। Truncating जब टेबल स्तर लॉक जोड़ा जाएगा।

हटाएँ

DELETE कमांड का उपयोग किसी तालिका से पंक्तियों को हटाने के लिए किया जाता है। कुछ पंक्तियों को हटाने के लिए जहां क्लॉज का उपयोग किया जा सकता है। यदि कोई शर्त नहीं है, तो सभी पंक्तियों को हटा दिया जाएगा। DELETE ऑपरेशन करने के बाद आपको परिवर्तन को स्थायी बनाने के लिए या इसे पूर्ववत करने के लिए लेन-देन को कम या सीमित करना होगा। ध्यान दें कि इस ऑपरेशन के कारण आग पर मेज पर सभी DELETE ट्रिगर हो जाएंगे। हटाने पर रो लेवल लॉक जोड़ा जाएगा।

प्रेषक: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


5
मेरे जैसे एक शुरुआत के लिए अच्छा स्पष्टीकरण
विकास कुकरेती

लघु और मधुर
ABH

23

सभी अच्छे उत्तर, जिनमें मुझे जोड़ना होगा:

चूंकि TRUNCATE TABLEएक डीडीएल ( डेटा डिफिकेशन लैंग्वेज ) है, डीएमएल ( डेटा मैनिपुलेशन लैंग्वेज ) कमांड Delete Triggersनहीं है।


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

SQL सर्वर आपको विदेशी कुंजियों के साथ एक तालिका को छोटा नहीं करने देगा, इसलिए प्लेटफ़ॉर्म के आधार पर आपका कैस्केडिंग बिंदु मूट हो सकता है।
मेफ

PostgreSQL के पास "TRUNCATE ट्रिगर" है
a_horse_with_no_name


17

SQL सर्वर या MySQL के साथ, यदि ऑटो वेतन वृद्धि के साथ PK है, तो truncate काउंटर को रीसेट करेगा।


स्पष्ट करने के लिए, यह SQL सर्वर के लिए है यदि तालिका में एक स्तंभ पहचान के रूप में परिभाषित किया गया है। हटाएं अंतिम स्वतः-निर्दिष्ट आईडी बनाए रखेंगी, जबकि ट्रंकट काउंटर रीसेट करता है।
कोडवर्ड

चूँकि प्रश्न को ORACLE टैग किया गया है, इसलिए यह उत्तर गलत है, इसलिए अस्वीकृत कर दिया गया है।
लड़के

ओह, ओरेकल टैग नहीं देखा :)
mathieu

+1 सत्य, और यह इसे 0 पर रीसेट करता है । यदि आप चाहते हैं कि यह 1 के बजाय:DBCC CHECKIDENT (table_name, RESEED, 1)
जॉन 16

मैंने इसे समुदाय के उत्तर में जोड़ दिया है, और इसे विक्रेता-विशिष्ट मुद्दों के दस्तावेज़ीकरण के लिए थोड़ा अधिक अनुकूल बना दिया है
डेविड एल्ड्रिज

12

"Truncate कुछ भी लॉग नहीं करता है" सही है। मैं और आगे जाऊँगा:

ट्रंकैट को लेनदेन के संदर्भ में निष्पादित नहीं किया जाता है।

डिलीट ओवर ट्रंकट का गति लाभ स्पष्ट होना चाहिए। यह लाभ आपकी स्थिति के आधार पर, तुच्छ से लेकर विशाल तक होता है।

हालाँकि, मैंने देखा है कि अनजाने में संदर्भात्मक अखंडता को तोड़ दिया है, और अन्य बाधाओं का उल्लंघन किया है। लेन-देन के बाहर डेटा को संशोधित करके हासिल करने वाली शक्ति को उस जिम्मेदारी के खिलाफ संतुलित होना चाहिए जो आपको विरासत में मिलती है जब आप नेट के बिना कसकर चलते हैं।


7

TRUNCATEDDL स्टेटमेंट है जबकि DELETEDML स्टेटमेंट है। नीचे दोनों के बीच अंतर हैं:

  1. जैसा TRUNCATEकि एक डीडीएल ( डेटा डेफिनिशन लैंग्वेज ) स्टेटमेंट है, इसमें बदलावों को स्थायी बनाने के लिए कमिटमेंट की जरूरत नहीं है। और यही कारण है कि ट्रंकैट द्वारा हटाई गई पंक्तियों को रोलबैक नहीं किया जा सका। दूसरी ओर DELETEएक डीएमएल ( डेटा हेरफेर भाषा ) स्टेटमेंट है, इसलिए इसके प्रभाव को स्थायी बनाने के लिए स्पष्ट प्रतिबद्धता की आवश्यकता है।

  2. TRUNCATEहमेशा एक तालिका से सभी पंक्तियों को हटा देता है, तालिका को खाली छोड़ देता है और तालिका संरचना को बरकरार रखता है जबकि DELETEजहां क्लॉज का उपयोग किया जाता है तो सशर्त रूप से हटा सकता है।

  3. TRUNCATE TABLEकथन द्वारा हटाई गई पंक्तियों को पुनर्स्थापित नहीं किया जा सकता है और आप TRUNCATEबयान में दिए गए खंड को निर्दिष्ट नहीं कर सकते ।

  4. TRUNCATEबयान चलाता आग नहीं करता है के रूप में पर नष्ट ट्रिगर पर की विरोध किया DELETEबयान

यहां विषय से संबंधित बहुत अच्छी लिंक दी गई है।


6

हां, DELETE धीमा है, TRUNCATE तेज है। क्यों?

DELETE को रिकॉर्ड पढ़ना चाहिए, बाधाओं की जांच करनी चाहिए, ब्लॉक को अपडेट करना चाहिए, इंडेक्स को अपडेट करना होगा, और रीडो / पूर्ववत उत्पन्न करना होगा। उस सब में समय लगता है।

TRUNCATE बस तालिका (हाई वॉटर मार्क) और पूफ के लिए डेटाबेस में एक पॉइंटर को समायोजित करता है! डेटा गया है।

यह Oracle विशिष्ट है, AFAIK।


PostgreSQL भी इसके समान है।
गैविन एम। रॉय

6

TRUNCATE

TRUNCATE SQL क्वेरी एक पंक्ति से सभी पंक्तियों को हटा देती है, बिना व्यक्तिगत पंक्ति हटाए लॉगिंग के।

  • TRUNCATE एक DDL कमांड है।
  • TRUNCATE को एक टेबल लॉक का उपयोग करके निष्पादित किया जाता है और सभी रिकॉर्ड को हटाने के लिए पूरी टेबल लॉक की जाती है।
  • हम TRUNCATE के साथ जहां क्लॉज का उपयोग नहीं कर सकते हैं।
  • TRUNCATE एक तालिका से सभी पंक्तियों को निकालता है।
  • लेन-देन लॉग में न्यूनतम लॉगिंग है, इसलिए यह तेज़ प्रदर्शन बुद्धिमान है।
  • TRUNCATE टेबल तालिका डेटा को संग्रहीत करने के लिए उपयोग किए गए डेटा पृष्ठों को डील करके डेटा हटाता है और लेनदेन लॉग में केवल पृष्ठ डीलक्लोशंस रिकॉर्ड करता है।
  • टेबल पर ट्रंकट का उपयोग करने के लिए आपको टेबल पर कम से कम ALTER अनुमति की आवश्यकता होती है।
  • डिलीट स्टेटमेंट की तुलना में ट्रंकट कम ट्रांजेक्शन स्पेस का उपयोग करता है।
  • अनुक्रमणित दृश्य के साथ Truncate का उपयोग नहीं किया जा सकता है।
  • TRUNCATE DELETE की तुलना में तेज़ है।

हटाएँ

DELETE कतार निष्पादित करने के लिए, लक्ष्य तालिका पर हटाए गए अनुमतियों की आवश्यकता होती है। यदि आपको किसी DELETE में WHERE क्लॉज़ का उपयोग करने की आवश्यकता है, तो चयन अनुमतियाँ भी आवश्यक हैं।

  • DELETE एक DML कमांड है।
  • DELETE को पंक्ति लॉक का उपयोग करके निष्पादित किया जाता है, तालिका में प्रत्येक पंक्ति को हटाने के लिए लॉक किया जाता है।
  • हम विशिष्ट रिकॉर्ड को फ़िल्टर करने और हटाने के लिए DELETE के साथ क्लॉज़ का उपयोग कर सकते हैं।
  • DELETE कमांड का उपयोग WHERE की स्थिति के आधार पर पंक्तियों को हटाने के लिए किया जाता है।
  • यह लॉग बनाए रखता है, इसलिए यह TRUNCATE की तुलना में धीमा है।
  • DELETE कथन पंक्तियों को एक बार में हटाता है और प्रत्येक हटाए गए पंक्ति के लिए लेनदेन लॉग में एक प्रविष्टि दर्ज करता है।
  • कॉलम की पहचान DELETE पहचान बनाए रखती है।
  • डिलीट का उपयोग करने के लिए आपको टेबल पर DELETE अनुमति की आवश्यकता है।
  • डिलीट ट्रंक स्टेटमेंट की तुलना में अधिक ट्रांजेक्शन स्पेस का उपयोग करता है।
  • हटाएं का उपयोग अनुक्रमित दृश्यों के साथ किया जा सकता है।

5

यदि गलती से आपने Delete / Truncate का उपयोग करके तालिका से सभी डेटा हटा दिया है। आप प्रतिबद्ध लेनदेन को रोलबैक कर सकते हैं। अंतिम बैकअप को पुनर्स्थापित करें और ट्रांजेक्शन लॉग को उस समय तक चलाएं जब डिलीट / ट्रंकट होने वाला हो।

नीचे संबंधित जानकारी एक ब्लॉग पोस्ट से है :

डेटाबेस पर काम करते समय, हम उनके बीच के अंतर को जाने बिना डिलीट और ट्रंकट का उपयोग कर रहे हैं। इस लेख में हम Sql में Delete और Truncate के बीच अंतर पर चर्चा करेंगे।

हटाएँ:

  • डिलीट एक डीएमएल कमांड है।
  • डिलीट स्टेटमेंट को एक पंक्ति लॉक का उपयोग करके निष्पादित किया जाता है, तालिका में प्रत्येक पंक्ति को हटाने के लिए लॉक किया जाता है।
  • हम फिल्टर को निर्दिष्ट कर सकते हैं कि कहां क्लॉज है।
  • यह निर्दिष्ट डेटा हटाता है यदि स्थिति कहाँ है।
  • गतिविधियों को ट्रिगर हटाएं क्योंकि ऑपरेशन व्यक्तिगत रूप से लॉग इन किया गया है।
  • Truncate से धीमा क्योंकि यह लॉग रखता है

काट-छांट

  • Truncate एक DDL कमांड है।
  • ट्रंकट टेबल हमेशा टेबल और पेज को लॉक करती है लेकिन प्रत्येक पंक्ति को नहीं। क्योंकि यह सभी डेटा को हटा देती है।
  • कहां शर्त का उपयोग नहीं कर सकते।
  • यह सभी डेटा को निकालता है।
  • ट्रंकट तालिका ट्रिगर को सक्रिय नहीं कर सकती है क्योंकि ऑपरेशन अलग-अलग पंक्ति विलोपन को लॉग नहीं करता है।
  • प्रदर्शन में तेज़, क्योंकि यह कोई लॉग नहीं रखता है।

नोट: हटाएं और काटें दोनों को लेन-देन के साथ उपयोग किए जाने पर वापस रोल किया जा सकता है। यदि लेन-देन किया जाता है, तो इसका मतलब है कि हम Truncate कमांड को रोलबैक नहीं कर सकते हैं, लेकिन हम अभी भी लॉग फाइल से कमांड को रोलबैक कर सकते हैं, क्योंकि डिलीट राइट रिकॉर्ड को लॉग फाइल से भविष्य में रोलबैक करने के लिए आवश्यक होने पर उन्हें रिकॉर्ड में हटा दें।

यदि आपके पास एक विदेशी कुंजी बाधा है जिस तालिका को आप छोटा करने का प्रयास कर रहे हैं, तो यह काम नहीं करेगा भले ही संदर्भित तालिका में कोई डेटा न हो। ऐसा इसलिए है क्योंकि DML के बजाय DDL के साथ विदेशी कुंजी जाँच की जाती है। यह तालिका में विदेशी कुंजी बाधा (ओं) को अस्थायी रूप से अक्षम करके चारों ओर प्राप्त किया जा सकता है।

डिलीट टेबल एक लॉग ऑपरेशन है। इसलिए प्रत्येक पंक्ति को हटाने से लेन-देन लॉग में लॉग हो जाता है, जिससे यह धीमा हो जाता है। Truncate तालिका एक तालिका में सभी पंक्तियों को हटा भी देती है, लेकिन यह प्रत्येक पंक्ति को हटाने के बजाय लॉग नहीं करेगी, क्योंकि यह तालिका के डेटा पृष्ठों के डीललॉउशन को लॉग करती है, जो इसे तेज़ बनाती है।

~ यदि गलती से आपने Delete / Truncate का उपयोग करके तालिका से सभी डेटा हटा दिया है। आप प्रतिबद्ध लेनदेन को रोलबैक कर सकते हैं। अंतिम बैकअप को पुनर्स्थापित करें और ट्रांजेक्शन लॉग को उस समय तक चलाएं जब डिलीट / ट्रंकट होने वाला हो।


1
धन्यवाद @ लुकास: उन्होंने सामग्री को रेखांकित किया। मैंने इसे स्पष्ट करने के लिए एक ब्लॉकचोट में रखा था कि यह एक अंतर स्रोत से था।
एस्ट्रो बीब

4

SQL Server 2005 में मेरा मानना ​​है कि आप एक ट्रंकट को रोलबैक कर सकते हैं


4

हटाएँ

DELETE कमांड का उपयोग किसी तालिका से पंक्तियों को हटाने के लिए किया जाता है। जहां कुछ पंक्तियों को हटाने के लिए एक खंड का उपयोग किया जा सकता है। यदि कोई शर्त निर्दिष्ट नहीं की जाती है, तो सभी पंक्तियों को हटा दिया जाएगा। DELETE ऑपरेशन करने के बाद आपको परिवर्तन को स्थायी बनाने के लिए या इसे पूर्ववत करने के लिए लेन-देन को कम या सीमित करना होगा। ध्यान दें कि इस ऑपरेशन के कारण आग पर मेज पर सभी DELETE ट्रिगर हो जाएंगे।

TRUNCATE

TRUNCATE एक तालिका से सभी पंक्तियों को निकालता है। ऑपरेशन वापस नहीं किया जा सकता है और कोई ट्रिगर नहीं निकाला जाएगा। जैसे, TRUCATE तेज़ है और DELETE के रूप में अधिक पूर्ववत स्थान का उपयोग नहीं करता है।

ड्रॉप

DROP कमांड डेटाबेस से एक टेबल हटाता है। सभी तालिकाओं की पंक्तियों, अनुक्रमित और विशेषाधिकारों को भी हटा दिया जाएगा। कोई डीएमएल ट्रिगर नहीं किया जाएगा। ऑपरेशन वापस नहीं किया जा सकता है।


DROP और TRUNCATE DDL कमांड हैं, जबकि DELETE एक DML कमांड है। इसलिए DELETE परिचालनों को वापस (पूर्ववत) किया जा सकता है, जबकि DROP और TRUNCATE परिचालनों को वापस नहीं लाया जा सकता है।

प्रेषक: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


क्या यह वर्तमान उत्तरों में कुछ जोड़ता है?
डेविड एल्ड्रिज

3

लेन-देन में लिपटे होने पर TRUNCATE को वापस ले जाया जा सकता है।

कृपया नीचे दो संदर्भ देखें और अपना परीक्षण करें: -

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE बनाम DELETE SQL साक्षात्कार के दौरान कुख्यात प्रश्नों में से एक है। बस यह सुनिश्चित करें कि आप इसे इंटरव्यूअर को ठीक से समझाएं या यह आपको काम का खर्च दे सकता है। समस्या यह है कि बहुत से लोग जागरूक नहीं हैं इसलिए सबसे अधिक संभावना है कि वे उत्तर को गलत मानेंगे यदि आप उन्हें बताते हैं कि हां ट्रंकैट को वापस लाया जा सकता है।


2

मूल उत्तर के लिए एक छोटा सा सुधार - डिलीट भी महत्वपूर्ण मात्रा में रीडो उत्पन्न करता है (जैसा कि पूर्ववत किया गया है कि यह Redo द्वारा संरक्षित है)। इसे ऑटोट्रेस आउटपुट से देखा जा सकता है:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed

इसके पुराने धागे लेकिन मेरी समझ के अनुसार केवल रेडो लॉग की अच्छी मात्रा उत्पन्न होती है जहां डिलीट पूर्ववत् और फिर से दोनों उत्पन्न करता है।
सौरभ सिन्हा

2

यहाँ SQL सर्वर में DELETE और TRUNCATE के अंतर पर मेरा विस्तृत जवाब है

डेटा निकालें : सबसे पहले, दोनों का उपयोग तालिका से पंक्तियों को हटाने के लिए किया जा सकता है।
लेकिन एक DELETE का उपयोग न केवल तालिका से पंक्तियों को हटाने के लिए किया जा सकता है, बल्कि एक VIEW से या प्रदाता क्षमताओं के अधीन OPENROWSET या OPENQUERY के परिणाम के रूप में भी किया जा सकता है।

खंड से : DELETE से आप एक तालिका से पंक्तियों को हटा सकते हैं / दूसरे पंक्ति से पंक्तियों के आधार पर पंक्तियों के आधार पर / rowet_function_limited हटा सकते हैं। उस FROM क्लॉज में आप सामान्य जॉइन शर्तों को भी लिख सकते हैं। वास्तव में आप एक SELET स्टेटमेंट से एक DELETE स्टेटमेंट बना सकते हैं जिसमें DELETE के साथ SELECT की जगह और कॉलम नामों को हटाकर कोई एग्रीगेट फ़ंक्शन नहीं है।
TRUNCATE के साथ आप ऐसा नहीं कर सकते।

जहां : एक ट्रेंक्यू में जहां स्थितियां नहीं हो सकती हैं, लेकिन एक शर्त हो सकती है। इसका मतलब है कि TRUNCATE के साथ आप एक विशिष्ट पंक्ति या विशिष्ट समूह पंक्तियों को हटा नहीं सकते। TRUNCATE टेबल DELETE कथन के समान है, जिसमें कोई भी खंड नहीं है।

प्रदर्शन : TRUNCATE टेबल तेज है और कम प्रणाली और लेनदेन लॉग संसाधनों का उपयोग करता है। और एक कारण या तो बयानों द्वारा उपयोग किए जाने वाले ताले हैं। DELETE कथन को पंक्ति लॉक का उपयोग करके निष्पादित किया जाता है, तालिका में प्रत्येक पंक्ति को हटाने के लिए लॉक किया गया है। TRUNCATE टेबल हमेशा टेबल और पेज को लॉक करता है लेकिन प्रत्येक पंक्ति को नहीं।

लेन-देन लॉग : DELETE स्टेटमेंट एक बार में पंक्तियों को हटाता है और प्रत्येक पंक्ति के लिए लेन-देन लॉग में व्यक्तिगत प्रविष्टियाँ बनाता है।
TRUNCATE टेबल तालिका डेटा को संग्रहीत करने के लिए उपयोग किए गए डेटा पृष्ठों को हटाकर डेटा को हटाता है और लेनदेन लॉग में केवल पृष्ठ डीलक्लोशंस रिकॉर्ड करता है।

पृष्ठ : एक DELETE कथन निष्पादित होने के बाद, तालिका में अभी भी खाली पृष्ठ हो सकते हैं। TRUNCATE तालिका डेटा को संग्रहीत करने के लिए उपयोग किए गए डेटा पृष्ठों को डीलिट करके डेटा को निकालता है।

ट्रिगर : TRUNCATE तालिका पर हटाए गए ट्रिगर्स को सक्रिय नहीं करता है। इसलिए TRUNCATE का उपयोग करते समय आपको बहुत सावधान रहना चाहिए। यदि ट्रिगर हटाए जाने पर कुछ स्वचालित सफाई या लॉगिंग क्रिया करने के लिए ट्रिगर को हटाए जाने पर एक TRUNCATE का उपयोग कभी नहीं किया जाना चाहिए।

पहचान कॉलम : TRUNCATE के साथ यदि तालिका में एक पहचान स्तंभ है, तो उस स्तंभ के लिए काउंटर स्तंभ के लिए परिभाषित बीज मान पर रीसेट हो जाता है। यदि कोई बीज परिभाषित नहीं किया गया था, तो डिफ़ॉल्ट मान 1 का उपयोग किया जाता है। DELETE पहचान काउंटर को रीसेट नहीं करता है। इसलिए यदि आप पहचान काउंटर को बनाए रखना चाहते हैं, तो इसके बजाय DELETE का उपयोग करें।

प्रतिकृति : DELETE का उपयोग लेनदेन प्रतिकृति या मर्ज प्रतिकृति में प्रयुक्त तालिका के खिलाफ किया जा सकता है।
जबकि TRUNCATE का उपयोग ट्रांसेक्शनल प्रतिकृति या मर्ज प्रतिकृति में शामिल तालिकाओं के विरुद्ध नहीं किया जा सकता है।

रोलबैक : DELETE स्टेटमेंट को वापस लाया जा सकता है।
TRUNCATE को वापस भी लुढ़काया जा सकता है, बशर्ते कि यह एक ट्रांजीशन ब्लॉक में संलग्न हो और सत्र बंद न हो। एक बार सत्र बंद हो जाने पर आप रोलबैक TRATECATE नहीं कर पाएंगे।

प्रतिबंध : अगर यह एक ट्रिगर का उल्लंघन करता है या एक विदेशी कुंजी बाधा के साथ एक और तालिका में एक पंक्ति डेटा द्वारा संदर्भित को दूर करने की कोशिश करता DELETE कथन विफल हो सकता है। यदि DELETE कई पंक्तियों को हटाता है, और हटा दी गई पंक्तियों में से कोई एक ट्रिगर या बाधा का उल्लंघन करता है, तो कथन रद्द कर दिया जाता है, एक त्रुटि वापस आ जाती है, और कोई पंक्तियाँ नहीं निकाली जाती हैं।
और यदि DELETE को View के विरुद्ध उपयोग किया जाता है, तो वह View एक अद्यतन करने योग्य दृश्य होना चाहिए। TRUNCATE को अनुक्रमित दृश्य में उपयोग की गई तालिका के विरुद्ध उपयोग नहीं किया जा सकता है।
TRUNCATE का उपयोग किसी FOREIGN कुंजी बाधा द्वारा संदर्भित तालिका के विरुद्ध नहीं किया जा सकता, जब तक कि उस तालिका में विदेशी कुंजी न हो जो स्वयं संदर्भित होती है।


हाय मंगल - उत्तर के लिए धन्यवाद, विशेष रूप से SQL * सर्वर विशिष्ट मुद्दों के लिए। क्या आपको लगता है कि आप कम्युनिटी विकी के उत्तर के साथ उन बिंदुओं को एकीकृत कर सकते हैं जिन्हें स्वीकार किया गया था?
डेविड एल्ड्रिज

हाँ यकीन है, लेकिन कैसे और कहाँ? क्षमा करें, मैं यहां नया हूं।
मंगल परदेशी

"इसलिए यदि आप पहचान काउंटर को बनाए रखना चाहते हैं, तो DELETE का उपयोग करें" क्या आप उपयोग कर सकते हैंDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag

1

सबसे बड़ा अंतर यह है कि डिलीट करते समय ट्रंकेट नॉन लॉग ऑपरेशन है।

सीधे शब्दों में इसका मतलब है कि डेटाबेस क्रैश के मामले में, आप ट्रंकट द्वारा संचालित डेटा को पुनर्प्राप्त नहीं कर सकते हैं, लेकिन हटा सकते हैं।

अधिक जानकारी यहाँ


1

DELETE कथन: यह कमांड केवल उन पंक्तियों को हटाता है जो दी गई स्थिति के आधार पर तालिका से होती है जहाँ कोई शर्त निर्दिष्ट नहीं होने पर तालिका से सभी पंक्तियों को हटा देता है या हटा देता है। लेकिन यह तालिका युक्त स्थान को मुक्त नहीं करता है।

SQL DELETE कथन का सिंटैक्स है:

तालिका से नाम हटाएं [कहां];

TRUNCATE कथन: इस कमांड का उपयोग तालिका से सभी पंक्तियों को हटाने और तालिका युक्त स्थान को मुक्त करने के लिए किया जाता है।


1

हटाएँ

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax  Delete from [Table] where [Condition]

TRUNCATE

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax  Truncate table [Table]

अधिक जानकारी के लिए देखें

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/


1

दो संचालन का एक और अंतर यह है कि यदि तालिका में एक पहचान स्तंभ है, तो उस कॉलम के लिए काउंटर TRUNCATE के तहत 1 (या स्तंभ के लिए परिभाषित बीज मान) पर रीसेट किया गया है। DELETE का यह प्रभाव नहीं है।


0

संक्षेप में, ट्रंकट कुछ भी लॉग नहीं करता है (इसलिए बहुत तेज़ है, लेकिन पूर्ववत नहीं किया जा सकता है) जबकि लॉग लॉग किया गया है (और एक बड़े लेनदेन का हिस्सा हो सकता है, रोलबैक होगा)। यदि आपके पास ऐसा डेटा है जिसे आप देव तालिका में नहीं चाहते हैं तो यह आम तौर पर छोटा हो जाता है क्योंकि आप लेन-देन लॉग भरने का जोखिम नहीं उठाते हैं


0

यह एक बड़ा कारण है, यह तब है, जब आपको मल्टी-मिलियन रो टेबल में डेटा रिफ्रेश करने की आवश्यकता होती है, लेकिन इसे फिर से बनाना नहीं चाहते। "हटाएं *" हमेशा के लिए ले जाएगा, जबकि ट्रंकट का इत्र प्रभाव नगण्य होगा।


0

एक dblink पर DDL नहीं कर सकते।


0

मैं मैथ्यू की पोस्ट पर टिप्पणी करूंगा, लेकिन मेरे पास अभी तक प्रतिनिधि नहीं है ...

MySQL में, ऑटो इंक्रीमेंट काउंटर को ट्रंकट के साथ रीसेट किया जाता है, लेकिन डिलीट के साथ नहीं।


0

ऐसा नहीं है कि ट्रंकैट SQL सर्वर में कुछ भी लॉग नहीं करता है। truncate किसी भी जानकारी को लॉग नहीं करता है, लेकिन यह उस तालिका के लिए डेटा पृष्ठ के डीक्लोकेशन को लॉग करता है जिस पर आपने TRUNCATE को निकाल दिया था।

और काटे गए रिकॉर्ड को रोलबैक किया जा सकता है यदि हम शुरुआत में लेनदेन को परिभाषित करते हैं और हम इसे रोलबैक करने के बाद छोटे रिकॉर्ड को पुनर्प्राप्त कर सकते हैं। लेकिन कटे हुए लेन-देन के बाद लेन-देन लॉग बैकअप से काटे गए रिकॉर्ड को पुनर्प्राप्त नहीं किया जा सकता है।


0

एक्सकम्पल को यहां Truncate भी रोलबैक किया जा सकता है

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

SQL में Truncate और Delete दो कमांड हैं जिनका उपयोग टेबल से डेटा को हटाने या हटाने के लिए किया जाता है। हालांकि प्रकृति में काफी बुनियादी दोनों Sql कमांड बहुत परेशानी पैदा कर सकते हैं जब तक कि आप इसे उपयोग करने से पहले विवरण से परिचित नहीं होते हैं। आदेश का गलत चुनाव परिणाम या तो बहुत धीमी प्रक्रिया हो सकता है या लॉग सेगमेंट को भी उड़ा सकता है, यदि बहुत अधिक डेटा हटाने की आवश्यकता है और लॉग सेगमेंट पर्याप्त नहीं है। इसीलिए यह जानना महत्वपूर्ण है कि एसक्यूएल में ट्रंकेट और कमांड का उपयोग कब करना है, लेकिन इनका उपयोग करने से पहले आपको ट्रंकेट और डिलीट के बीच अंतर के बारे में पता होना चाहिए, और उनके आधार पर, हमें यह पता लगाने में सक्षम होना चाहिए कि DELETE हटाने के लिए बेहतर विकल्प है डेटा या TRUNCATE का उपयोग तालिकाओं को शुद्ध करने के लिए किया जाना चाहिए।

जांच का संदर्भ लें यहाँ क्लिक करें


0

TRUNCATE TABLE स्टेटमेंट जारी करके, आप SQL सर्वर को निर्देश दे रहे हैं कि वह बिना किसी लॉगिंग या ट्रांजेक्शन प्रोसेसिंग के, एक टेबल के भीतर हर रिकॉर्ड को डिलीट कर दे।


0

DELETE स्टेटमेंट में विशिष्ट रिकॉर्ड को हटाने के लिए WHERE क्लॉज हो सकता है जबकि TRUNCATE स्टेटमेंट को किसी की आवश्यकता नहीं होती है और पूरी तालिका को मिटा देता है। महत्वपूर्ण रूप से, DELETE कथन हटाए गए दिनांक को लॉग करता है जबकि TRUNCATE कथन नहीं करता है।


0

Microsoft sql सर्वर के लिए विशिष्ट एक और अंतर यह है कि deleteआप outputस्टेटमेंट का उपयोग यह जानने के लिए कर सकते हैं कि क्या रिकॉर्ड डिलीट किए गए हैं, जैसे:

delete from [SomeTable]
output deleted.Id, deleted.Name

आप ऐसा नहीं कर सकते truncate

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