ININ JOIN के साथ SQL DELETE


120

2 टेबल हैं, spawnlistऔर npc, मुझे डेटा को हटाने की आवश्यकता है spawnlsitnpc_templateid = n.idTemplateकेवल एक चीज है जो तालिकाओं को "कनेक्ट" करती है। मैंने इस स्क्रिप्ट की कोशिश की है, लेकिन यह काम नहीं करता है।

मैंने यह कोशिश की है:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

1
अधिक आश्चर्य हुआ क्योंकि आमतौर पर L2 समुदाय अपने आप को रखता है। सवाल पढ़ने और सोचने के दौरान थोड़ा अजीब था "जो दिखता है ... हम्म ... यह है!" :)
कॉर्बिन

1
@ कोर्बिन मैं पूरी तरह से आप क्या मतलब है देखते हैं। काफी दिलचस्प है, मुझे एक एल 2 सवाल पर एक कार्य परियोजना में मदद मिल रही है।
मार्को औरेलियो देलेउ

तालिका 1 से तालिका 1 से हटाएं। t1.id = t2.id पर तालिका 2 t2 इनर जॉइन करें; विवरण में youtu.be/_tyUVrS2iH4
अमरेश कुमार सिंह

जवाबों:


225

जोड़े .*को sअपनी पहली पंक्ति में।

प्रयत्न:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

यहाँ मुझे मिली त्रुटि है: [त्रुटि] 1064 - आपके SQL सिंटैक्स में एक त्रुटि है; उस मैनुअल की जाँच करें जो आपके MySQL सर्वर वर्जन से मेल खाती है, 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n के पास का उपयोग करने के लिए लाइन 1 पर s.npc_t पर [Err] DELETE l2revo.root। spblist से db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "राक्षस"); [Msg] समाप्त - असफल -------------------------------------------- ------
JoinOG

आपकी त्रुटि में ऐसा लगता है कि आपके लिए दो अलग-अलग सर्वर नामों का उपयोग किया जा रहा है spawnlist। मैं देख रहा हूँ l2revo.root.spawnlistऔर db.root.spawnlist
सोच रहा था

मैं बस इसे यहाँ पेस्ट करने की गलती करता हूँ, लेकिन उपयोगकर्ता का नाम और db नाम एक ही है, मेरी गलती पर।
JoinOG

ASअपने उपनाम के लिए जोड़ने का प्रयास करें ।
ThinkingStiff

4
@GauravRamanan s। * Mysql को बताता है कि DELETE को क्या चाहिए, आप
JOINED

12

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

हालांकि इस उदाहरण के लिए मुझे नहीं लगता कि आपको पहले s की आवश्यकता है:

DELETE s 
FROM spawnlist AS s 
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate 
WHERE n.type = "monster";

हटाने से पहले पंक्तियों का चयन करना एक बेहतर विचार हो सकता है ताकि आप सुनिश्चित करें कि आप जो चाहते हैं उसे हटा दें:

SELECT * FROM spawnlist
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate
WHERE npc.type = "monster";

आप यहां MySQL डिलीट सिंटैक्स भी देख सकते हैं: http://dev.mysql.com/doc/refman/5.0/en/dex.html


यह मुझे मिलने वाली त्रुटि है: [त्रुटि] 1064 - आपके SQL सिंटैक्स में एक त्रुटि है; मैनुअल की जाँच करें जो आपके MySQL सर्वर वर्जन से मेल खाती है, जो सही सिंटैक्स के पास है INNER JOIN npc n ON का उपयोग करने के लिए s.npc_templateid = n.idTemplate पर n.type = "monste" के लिए 1 लाइन पर [Err] DELETE से स्पॉनलिस्ट सूचि JOIN npc n ON s.npc_templateid = n.idTemplate WHO n.type "" मॉन्स्टर "; [Msg] समाप्त - असफल ------------------------ --------------------------
JoinOG

परिवर्तित, अब और अधिक सफल हो सकता है?
दान

त्रुटि: [त्रुटि] १०६६ - अद्वितीय तालिका / उपनाम नहीं: [npc ’[Err] DELETE spawnlist from spawnlist, npc INNER JOIN npc WHITE spawnlist.npc_template/ npc.idTemplate AND npc.type =" मॉन्स्टर "; [Msg] समाप्त - असफल -------------------------------------------- ------
JoinOG

यदि आप इसे केवल एक बार चलाने जा रहे हैं, तो आप बहुत ही अक्षम रूप से भाग सकते हैं: DELETE FROM spawnlist कहाँ से npc_templateid IN (npc WHERE टाइप = "मॉन्स्टर" से सेलेक्ट idTemplate);
कॉर्बिन

यह मेरा आखिरी प्रयास है, यदि आपकी ज्वाइनिंग पर सिर्फ एक टेबल से डिलीट हो जाता है तो मैं यह नहीं देख सकता कि वह काम क्यों नहीं करेगा।
दान

6

अगर डेटाबेस InnoDB है, तो आपको हटाने में शामिल होने की आवश्यकता नहीं है। केवल

DELETE FROM spawnlist WHERE spawnlist.type = "monster";

अन्य तालिकाओं में विदेशी कुंजियों के साथ लिंक किए गए सभी रिकॉर्ड को हटाने के लिए उपयोग किया जा सकता है, यह करने के लिए कि आपको पहले डिज़ाइन समय में अपनी तालिकाओं को लिंक करना होगा।

CREATE TABLE IF NOT EXIST spawnlist (
  npc_templateid VARCHAR(20) NOT NULL PRIMARY KEY

)ENGINE=InnoDB;

CREATE TABLE IF NOT EXIST npc (
  idTemplate VARCHAR(20) NOT NULL,

  FOREIGN KEY (idTemplate) REFERENCES spawnlist(npc_templateid) ON DELETE CASCADE

)ENGINE=InnoDB;

यदि आप MyISAM का उपयोग करते हैं तो आप इस तरह से जुड़ने वाले रिकॉर्ड को हटा सकते हैं

DELETE a,b
FROM `spawnlist` a
JOIN `npc` b
ON a.`npc_templateid` = b.`idTemplate`
WHERE a.`type` = 'monster';

पहली पंक्ति में मैंने रिकॉर्ड को हटाने के लिए दो टेम्‍प टेबल को इनिशियलाइज़ किया है, दूसरी लाइन में मैंने अस्तित्व तालिका को बी और बी दोनों को सौंपा है लेकिन यहाँ मैंने दोनों टेबल को एक साथ कीवर्ड से जोड़ा है, और मैंने प्राथमिक और विदेशी कुंजी का मिलान किया है लिंक बनाने वाली दोनों तालिकाओं के लिए, अंतिम पंक्ति में मैंने हटाने के लिए फ़ील्ड द्वारा रिकॉर्ड फ़िल्टर किया है।


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