समान स्तंभ मानों के साथ mysql तालिका से एक निश्चित पंक्ति को कैसे हटाएं?


153

मुझे MySQL में मेरे प्रश्नों से समस्या है। मेरी तालिका में 4 कॉलम हैं और यह कुछ इस तरह दिखता है:

id_users    id_product    quantity    date
 1              2              1       2013
 1              2              1       2013
 2              2              1       2013
 1              3              1       2013

id_usersऔर id_productविभिन्न तालिकाओं से विदेशी कुंजी हैं।

मैं जो चाहता हूं वह सिर्फ एक पंक्ति को हटाना है:

1     2     1    2013

जो दो बार दिखाई देता है, इसलिए मैं इसे हटाना चाहता हूं।

मैंने यह प्रश्न आज़माया है:

delete from orders where id_users = 1 and id_product = 2

लेकिन यह दोनों को हटा देगा (क्योंकि वे डुप्लिकेट हैं)। इस समस्या को हल करने पर कोई संकेत?

जवाबों:


208

एक जोड़े limitको हटाने क्वेरी

delete from orders 
where id_users = 1 and id_product = 2
limit 1

3
यह केवल एक पंक्ति को हटाता है। अगर इस उपयोगकर्ता और उत्पाद आईडी के साथ 3 थे तो 2 रहेगा।
रोब

10
हां, ओपी कहता है कि वह 1 पंक्ति हटाना चाहता है। यही मेरी क्वेरी है।
juergen d

2
हां, लेकिन मुझे लगता है कि यह वह नहीं है जो वह चाहती है।
रोब

3
धन्यवाद Juergen। मुझे बस यही चाहिए!
दानी

3
ओपी को वास्तव में क्या करना है, पहले यह जांचना है कि कौन सी पंक्तियों को डुप्लिकेट किया गया है फिर डुप्लिकेट को हटा दें।
wbinky

64

सभी तालिकाओं में एक प्राथमिक कुंजी (एकल या एकाधिक स्तंभों से युक्त) होनी चाहिए, डुप्लिकेट पंक्तियाँ संबंधपरक डेटाबेस में कोई मतलब नहीं रखती हैं। आप LIMITहालांकि उपयोग करके पंक्तियों की संख्या को सीमित कर सकते हैं :

DELETE FROM orders WHERE id_users = 1 AND id_product = 2 LIMIT 1

लेकिन यह सिर्फ आपके वर्तमान मुद्दे को हल करता है, आपको निश्चित रूप से प्राथमिक मुद्दों को परिभाषित करके बड़े मुद्दे पर काम करना चाहिए।


1
यह उल्लेख करना अच्छा है कि एक रिलेशनल डेटाबेस में प्राथमिक कुंजी अद्वितीय होनी चाहिए।
पॉल

1
@Paul यह वही है जो मैं कहने वाला हूं। लेकिन यह मत भूलना कि अद्वितीय कुंजी आवश्यक नहीं है प्राथमिक कुंजी का मतलब है।
रयान फंग

20

आपको उन पंक्तियों की संख्या निर्दिष्ट करने की आवश्यकता है जिन्हें हटा दिया जाना चाहिए। आपके मामले में (और मुझे लगता है कि आप केवल एक ही रखना चाहते हैं) यह इस तरह किया जा सकता है:

DELETE FROM your_table WHERE id_users=1 AND id_product=2
LIMIT (SELECT COUNT(*)-1 FROM your_table WHERE id_users=1 AND id_product=2)

धन्यवाद रॉब, लेकिन नहीं ... मैं सिर्फ एक ही पंक्ति को हटाना चाहता हूं, न कि केवल एक रखने के लिए
दानी

यह 5.5.40 में मेरे लिए काम नहीं कर रहा है, यह एक सिंटैक्स त्रुटि फेंकता है। जैसा कि यहां बताया गया है: stackoverflow.com/a/578926/1076075 , ऐसा लगता है कि हम एक उपखंड का उपयोग एक सीमा खंड के मूल्य को निर्दिष्ट करने के लिए नहीं कर सकते। इस तरह से सामान करने की कोशिश करने वाले किसी भी व्यक्ति के लिए, इसे देखें: stackoverflow.com/q/578867/1076075
भारद्वाज श्रीगिरिराजु

8

तालिका को डिज़ाइन करने का सबसे अच्छा तरीका ऑटो वृद्धि के रूप में एक अस्थायी पंक्ति को जोड़ना और प्राथमिक कुंजी के रूप में रखना है। इसलिए हम ऐसे उपरोक्त मुद्दों से बच सकते हैं।


1
या एक स्थायी पंक्ति। मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे यह कहना चाहिए। इस तरह की स्थिति के लिए आईडी का उपयोग किया जाता है। यदि आप अंतरिक्ष के बारे में चिंतित हैं: एक बड़ा केवल 8 बाइट्स है!
इस्माइल मिगुएल

5

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

मैं अन्य तरीके दूंगा:

  1. यूनिक इंडेक्स बनाकर

मुझे लगता है कि id_users और id_product आपके उदाहरण में अद्वितीय होने चाहिए।

ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)

ये समान डेटा वाली डुप्लिकेट पंक्तियों को हटा देंगे।

लेकिन अगर आपको अभी भी कोई त्रुटि मिलती है, भले ही आप IGNORE क्लॉज का उपयोग करें, यह प्रयास करें:

ALTER TABLE orders ENGINE MyISAM;
ALTER IGNORE TABLE orders ADD UNIQUE INDEX unique_columns_index (id_users, id_product)
ALTER TABLE orders ENGINE InnoDB; 
  1. फिर से टेबल बनाकर

यदि कई पंक्तियाँ हैं जिनके पास डुप्लिकेट मान हैं, तो आप तालिका को फिर से बना सकते हैं

RENAME TABLE `orders` TO `orders2`;

CREATE TABLE `orders` 
SELECT * FROM `orders2` GROUP BY id_users, id_product;

1

आपको प्रत्येक पंक्ति के लिए एक ऑटो जोड़ना होगा, उसके बाद आप अपनी आईडी द्वारा पंक्ति को हटा सकते हैं। इसलिए आपकी तालिका में प्रत्येक पंक्ति और id_user, id_product ecc के लिए एक अद्वितीय आईडी होगी ...

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