तालिकाओं को छोटा करने से सावधान रहें
किसी भी आरडीबीएमएस में टेबल को छोटा करने से सावधान रहें, खासकर यदि आप प्रतिबद्ध/रोलबैक कार्यक्षमता के लिए स्पष्ट लेनदेन का उपयोग करना चाहते हैं। कृपया इस उत्तर की 'मेरी सिफारिश' पढ़ें।
DDL स्टेटमेंट एक निहित-प्रतिबद्धता करते हैं
Truncate टेबल स्टेटमेंट डेटा डेफिनिशन लैंग्वेज (DDL) स्टेटमेंट होते हैं, और इस तरह ट्रंकेट टेबल स्टेटमेंट्स एक अंतर्निहित COMMIT
को ट्रिगर करते हैं। डेटाबेस में उनके निष्पादन पर . अगर आप TABLE TRUNCATE
करते हैं तो डेटाबेस परोक्ष रूप से प्रतिबद्ध है - भले ही TABLE TRUNCATE
एक START TRANSACTION
. के भीतर है स्टेटमेंट--आपकी टेबल को छोटा कर दिया जाएगा और एक ROLLBACK
होगा नहीं इसे पुनर्स्थापित करें।
क्योंकि ट्रंकेट टेबल स्टेटमेंट निहित कमिट करते हैं, मैक्सेंस का जवाब उम्मीद के मुताबिक प्रदर्शन नहीं करता है (लेकिन यह गलत नहीं है, क्योंकि सवाल था "एक टेबल को कैसे छोटा करें")। उसका उत्तर अपेक्षानुसार प्रदर्शन नहीं करता है क्योंकि यह try
. में तालिका को छोटा कर देता है ब्लॉक करता है, और मानता है कि तालिका को catch
. में पुनर्स्थापित किया जा सकता है ब्लॉक, अगर कुछ गलत हो जाता है। यह गलत धारणा है।
इस थ्रेड में अन्य उपयोगकर्ता की टिप्पणियां और अनुभव
क्रिसएल्ब्रेक्ट ठीक से काम करने के लिए मैक्सेंस के समाधान को प्राप्त करने में असमर्थ था क्योंकि आप एक ट्रंकेट टेबल स्टेटमेंट को रोलबैक नहीं कर सकते, भले ही ट्रंकेट टेबल स्टेटमेंट एक स्पष्ट लेनदेन में हो।
user2130519, दुर्भाग्य से, सही उत्तर देने के लिए डाउनवोट (-1 जब तक मैंने अपवोट नहीं किया) - हालांकि उसने अपने उत्तर को सही ठहराए बिना ऐसा किया, जो आपके काम को दिखाए बिना गणित करने जैसा है।
मेरा सुझाव DELETE FROM
मेरा सुझाव है कि DELETE FROM
. का उपयोग करें . ज्यादातर मामलों में, यह डेवलपर की अपेक्षा के अनुरूप प्रदर्शन करेगा। लेकिन, DELETE FROM
कमियों के बिना नहीं आता--आपको तालिका के लिए स्वतः वृद्धि मान को स्पष्ट रूप से रीसेट करना होगा। टेबल के लिए ऑटो इंक्रीमेंट वैल्यू को रीसेट करने के लिए, आपको एक और डीडीएल स्टेटमेंट का उपयोग करना चाहिए--ALTER TABLE
--और, फिर से, ALTER TABLE
. का उपयोग न करें अपने try
. में खंड मैथा। यह अपेक्षा के अनुरूप काम नहीं करेगा।
यदि आप इस बारे में सुझाव चाहते हैं कि आपको DELETE FROM
का उपयोग कब करना चाहिए? बनाम TRUNCATE
देखिए ए> ।
यदि आपको वास्तव में जरूरी है, तो यहां बताया गया है कि कैसे छंटनी की जाती है
अब, उस सब के साथ कहा। यदि आप वास्तव में Doctrine2 का उपयोग करके किसी तालिका को छोटा करना चाहते हैं, तो इसका उपयोग करें:(नीचे मैक्सेंस के उत्तर का वह भाग है जो तालिका को सही ढंग से काटता है)
$cmd = $em->getClassMetadata($className);
$connection = $em->getConnection();
$dbPlatform = $connection->getDatabasePlatform();
$connection->query('SET FOREIGN_KEY_CHECKS=0');
$q = $dbPlatform->getTruncateTableSql($cmd->getTableName());
$connection->executeUpdate($q);
$connection->query('SET FOREIGN_KEY_CHECKS=1');
रोलबैक/प्रतिबद्ध कार्यक्षमता वाली तालिका को कैसे हटाएं।
लेकिन, यदि आप रोलबैक/प्रतिबद्ध कार्यक्षमता चाहते हैं, तो आपको DELETE FROM
. का उपयोग करना चाहिए :(नीचे मैक्सेंस के उत्तर का संशोधित संस्करण है।)
$cmd = $em->getClassMetadata($className);
$connection = $em->getConnection();
$connection->beginTransaction();
try {
$connection->query('SET FOREIGN_KEY_CHECKS=0');
$connection->query('DELETE FROM '.$cmd->getTableName());
// Beware of ALTER TABLE here--it's another DDL statement and will cause
// an implicit commit.
$connection->query('SET FOREIGN_KEY_CHECKS=1');
$connection->commit();
} catch (\Exception $e) {
$connection->rollback();
}
यदि आपको ऑटो इंक्रीमेंट मान को रीसेट करने की आवश्यकता है, तो ALTER TABLE <tableName> AUTO_INCREMENT = 1
पर कॉल करना न भूलें। ।