MySQL
हटाएँ
खोज…
वाक्य - विन्यास
- DELETE [LOW_PRIORITY] [QUICK] [IGNORE] टेबल से [जहां शर्तें] [अभिव्यक्ति द्वारा आदेश] ASC | DESC]] [लिमाइट नंबर_रो]; /// सिंटैक्स सिंगल टेबल से डिलीट रो (एस) के लिए
पैरामीटर
पैरामीटर | विवरण |
---|---|
कम प्राथमिकता | यदि LOW_PRIORITY प्रदान की जाती है, तो तालिका से पढ़ने की कोई प्रक्रिया नहीं होने तक डिलीट में देरी होगी |
नज़रअंदाज़ करना | यदि IGNORE प्रदान किया जाता है, तो डिलीट के दौरान आई सभी त्रुटियों को नजरअंदाज कर दिया जाता है |
तालिका | वह तालिका जिससे आप रिकॉर्ड हटाना चाहते हैं |
कहां की स्थितियां | रिकॉर्ड को हटाने के लिए जो शर्तें पूरी होनी चाहिए। यदि कोई स्थिति प्रदान नहीं की जाती है, तो तालिका से सभी रिकॉर्ड हटा दिए जाएंगे |
अभिव्यक्ति द्वारा आदेश | यदि ORDER BY प्रदान किया जाता है, तो दिए गए क्रम में रिकॉर्ड हटा दिए जाएंगे |
आप LIMIT | यह तालिका से हटाने के लिए रिकॉर्ड की अधिकतम संख्या को नियंत्रित करता है। दिए गए number_rows को हटा दिया जाएगा। |
जहां क्लॉज के साथ डिलीट करें
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
यह उस तालिका से सभी पंक्तियों को हटा देगा जहाँ उस पंक्ति के लिए field_one
की सामग्री 'value_one' से मेल खाती है
WHERE
क्लॉज कुछ चुनिंदा तरीकों से ही काम करता है, इसलिए >
, <
, <>
या LIKE
जैसी चीजों का इस्तेमाल किया जा सकता है।
सूचना: डिलीट क्वेरी में सशर्त खंड (WHERE, LIKE) का उपयोग करना आवश्यक है। यदि आप किसी भी सशर्त खंड का उपयोग नहीं करते हैं, तो उस तालिका के सभी डेटा हटा दिए जाएंगे।
किसी तालिका से सभी पंक्तियों को हटा दें
DELETE FROM table_name ;
यह तालिका से सभी पंक्तियों को हटा देगा। यह वाक्य रचना का सबसे बुनियादी उदाहरण है। यह भी दर्शाता है कि DELETE
कथनों को वास्तव में अतिरिक्त देखभाल के साथ उपयोग किया जाना चाहिए क्योंकि वे तालिका को खाली कर सकते हैं, यदि WHERE
क्लॉज छोड़ा गया है।
सीमा हटाई जा रही है
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
यह उसी तरह से काम करता है जैसे 'डिलीट विद व्हेयर क्लॉज' उदाहरण में, लेकिन सीमित संख्या में पंक्तियों को हटाने के बाद यह डिलीट को रोक देगा।
यदि आप इस तरह हटाने के लिए पंक्तियों को सीमित कर रहे हैं, तो ध्यान रखें कि यह मापदंड से मेल खाने वाली पहली पंक्ति को हटा देगा। यह वह नहीं हो सकता है जिसकी आप अपेक्षा करेंगे, क्योंकि परिणाम स्पष्ट रूप से वापस आ सकते हैं यदि उन्हें स्पष्ट रूप से आदेश नहीं दिया गया है।
मल्टी-टेबल डिलेट्स
MySQL के DELETE
स्टेटमेंट में JOIN
कंस्ट्रक्शन का उपयोग किया जा सकता है, जिससे यह भी निर्दिष्ट किया जा सकता है कि किन तालिकाओं को हटाना है। यह नेस्टेड प्रश्नों से बचने के लिए उपयोगी है। स्कीमा दिया:
create table people
( id int primary key,
name varchar(100) not null,
gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');
create table pets
( id int auto_increment primary key,
ownerId int not null,
name varchar(100) not null,
color varchar(100) not null
);
insert pets(ownerId,name,color) values
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
आईडी | नाम | लिंग |
---|---|---|
1 | कैथी | च |
2 | जॉन | म |
3 | पॉल | म |
4 | किम | च |
आईडी | ownerId | नाम | रंग |
---|---|---|---|
1 | 1 | घुमंतू | बेज |
2 | 2 | बुलबुले | बैंगनी |
4 | 1 | Rover2 | सफेद |
अगर हम पॉल के पालतू जानवरों को हटाना चाहते हैं, तो बयान
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
के रूप में फिर से लिखा जा सकता है:
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 पंक्ति हटा दी गई
स्पॉट पालतू जानवरों से हटा दिया जाता है
p1
और p2
टेबल नामों के लिए उपनाम हैं, विशेष रूप से लंबे टेबल नामों के लिए उपयोगी और पठनीयता में आसानी।
व्यक्ति और पालतू दोनों को निकालने के लिए:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 पंक्तियों को हटा दिया गया
स्पॉट पालतू जानवरों से हटा दिया जाता है
पॉल को लोगों से हटा दिया गया है
विदेशी कुंजी
जब DELETE स्टेटमेंट एक मुख्य कुंजी के साथ तालिकाओं पर आक्रमण करता है, तो अनुकूलक एक क्रम में तालिकाओं को संसाधित कर सकता है जो संबंध का पालन नहीं करता है। उदाहरण के लिए pets
की परिभाषा के लिए एक विदेशी कुंजी जोड़ना
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
इंजन pets
से पहले people
से प्रविष्टियों को हटाने की कोशिश कर सकता है, इस प्रकार निम्नलिखित त्रुटि का कारण बनता है:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))
इस मामले में समाधान people
से पंक्ति को हटाने और हटाने के लिए प्रचार करने के लिए InnoDB
की ON DELETE
क्षमताओं पर भरोसा करना है:
DELETE FROM people
WHERE name = 'Paul';
2 पंक्तियों को हटा दिया गया
पॉल को लोगों से हटा दिया गया है
स्पॉट पालतू जानवरों से कैस्केड पर हटा दिया जाता है
एक और उपाय है कि आप फ़ोरिंग कीज़ पर चेक को अस्थायी रूप से निष्क्रिय कर दें:
SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;
मूल हटाना
DELETE FROM `myTable` WHERE `someColumn` = 'something'
WHERE
क्लॉज वैकल्पिक है लेकिन इसके बिना सभी पंक्तियों को हटा दिया जाता है।
DELETE बनाम TRUNCATE
TRUNCATE tableName;
यह सभी डेटा हटा देगा और AUTO_INCREMENT
इंडेक्स रीसेट कर देगा। यह एक विशाल डेटासेट पर DELETE FROM tableName
से DELETE FROM tableName
बहुत तेज़ है। यह विकास / परीक्षण के दौरान बहुत उपयोगी हो सकता है।
जब आप किसी तालिका को काटते हैं तो SQL सर्वर डेटा को डिलीट नहीं करता है, यह तालिका को गिरा देता है और इसे फिर से बनाता है, जिससे पृष्ठों का निपटारा होता है, इसलिए पृष्ठों के पहले छंटनी किए गए डेटा को पुनर्प्राप्त करने का एक मौका होता है जहां ओवरराइट किया जाता है। (रिक्त स्थान innodb_file_per_table=OFF
लिए तुरंत innodb_file_per_table=OFF
नहीं किया जा सकता है।)
मल्टी-टेबल DELETE
MySQL यह निर्दिष्ट करने की अनुमति देता है कि मिलान पंक्तियों को किस तालिका से हटाया जाना चाहिए
-- remove only the employees
DELETE e
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove employees and department
DELETE e, d
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'
-- remove from all tables (in this case same as previous)
DELETE
FROM Employees e JOIN Department d ON e.department_id = d.department_id
WHERE d.name = 'Sales'