2008-11-13 1 views
17

क्या कोई पंक्ति डालना संभव है, लेकिन केवल तभी तालिका में मौजूद मानों में से कोई एक मौजूद नहीं है?क्या कोई पंक्ति डालना संभव है लेकिन केवल तभी जब कोई मान पहले से मौजूद नहीं है?

मैं एक बना रहा हूं, एक ईकॉमर्स सिस्टम के लिए रेफ़रल बिंदुओं के साथ एक मित्र बताएं, जहां मुझे डेटाबेस तालिका में मित्र का ईमेल डालने की आवश्यकता है, लेकिन केवल तभी यदि यह तालिका में पहले से मौजूद नहीं है। ऐसा इसलिए है क्योंकि जब मैं नया ग्राहक साइन अप करता हूं और कुछ खरीदता हूं तो मैं नहीं चाहता कि 1 से अधिक व्यक्ति रेफ़रल पॉइंट प्राप्त कर रहे हों। इसलिए मैं टेबल में एक बार कभी एक ईमेल चाहता हूं।

मैं PHP 4 और MySQL 4.1 का उपयोग कर रहा हूं।

उत्तर

21

स्तंभ प्राथमिक कुंजी या एक अद्वितीय सूचकांक है:

INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE 
email=email_address 

मेरी किस्मत को जानने का वहाँ हालांकि यह करने का एक बेहतर तरीका है। AFAIK MySQL में "ऑन डिप्लिकेट कुंजी कुछ भी नहीं" के बराबर नहीं है। मुझे ईमेल = ईमेल_ एड्रेस बिट के बारे में निश्चित नहीं है, आप इसके बारे में खेल सकते हैं और देख सकते हैं कि यह आपके बिना किसी क्रिया को निर्दिष्ट किए काम करता है या नहीं। जैसा कि उपर्युक्त राज्य बताता है, अगर इसमें अनूठी बाधाएं हैं तो वैसे भी कुछ भी नहीं होगा। और यदि आप किसी तालिका में सभी ईमेल पते अद्वितीय होना चाहते हैं तो इसे अपनी कॉलम परिभाषा में अद्वितीय के रूप में निर्दिष्ट करने का कोई कारण नहीं है।

+0

मैंने phpMyAdmin में एक अनूठी कुंजी पर ईमेल सेट किया और फिर अपना कोड इस्तेमाल किया। और यह बहुत अच्छा काम किया! धन्यवाद – alex

+0

पुन: ऑन डिप्लिकेट कुंजी के बराबर कुछ भी नहीं। टोड का समाधान देखें। वैकल्पिक रूप से, आप शायद डिप्लिकेट कुंजी अपडेट ईमेल = ईमेल जैसे कुछ कर सकते हैं, हालांकि यह निश्चित रूप से अधिक अपर्याप्त है। –

1

मुझे यकीन है कि अगर मैं यह मिल गया है, लेकिन क्या एक

try { 
    mysql_query($sql); 
} 
catch(Exception $e) { 

} 

MySQL में एक अद्वितीय क्षेत्र सूचकांक के साथ संयुक्त के बारे में नहीं कर रहा हूँ?

यदि यह अपवाद फेंकता है तो आप जानते हैं कि आपको एक डुप्लिकेट फ़ील्ड मिला है। क्षमा करें अगर वह आपके प्रश्न का उत्तर नहीं देता ..

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन मैं इसे अपने समस्या का हल नहीं लगता। मुझे एक भी प्रश्न चाहिए जो या तो पंक्ति को सम्मिलित करता है, या अगर यह विफल रहता है तो कुछ भी नहीं करता है। – alex

+0

यदि कोई अपवाद फेंक दिया गया है, तो पंक्ति को जोड़ा नहीं जाएगा। आप बस लॉग इन कर सकते हैं, या पकड़ में कुछ भी नहीं कर सकते हैं। – Feet

+0

लेकिन पिछली क्वेरी के साथ, यह हर बार एक त्रुटि हुई। मैं चाहता था कि यह चुपचाप मेरे एसक्यूएल में विफल हो जाए। – alex

0

यदि ईमेल फ़ील्ड प्राथमिक कुंजी थी तो तालिका पर बाधाओं को डुप्लिकेट दर्ज करने से रोक दिया जाएगा।

6

सबसे अधिक संभावना कुछ की तरह:

IF NOT EXISTS(SELECT * FROM myTable WHERE [email protected]) THEN INSERT INTO blah blah 

एक डेटाबेस क्वेरी में लुढ़काया जा सकता है।

32

यह काम करता है, तो आप एक अद्वितीय सूचकांक या स्तंभ पर प्राथमिक कुंजी है (इस उदाहरण में EmailAddr):

INSERT IGNORE INTO Table (EmailAddr) VALUES ('[email protected]') 

एक की अगर यह का उपयोग करना है कि ईमेल के साथ एक रिकॉर्ड पहले से मौजूद है (कुंजी उल्लंघन नकल) के बजाय त्रुटि, कथन बस विफल रहता है और कुछ भी डाला नहीं जाता है।

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

+0

"इंसर्ट इग्नोर" सबसे अच्छा जवाब है, लेकिन REPLACE (http://dev.mysql.com/doc/refman/5.0/en/replace.html) एक विकल्प भी है यदि आप किसी कारण से पंक्ति को फिर से जोड़ना चाहते हैं (शायद एक टाइमस्टैम्प ट्रिगर या कुछ)। – gpojd

+4

अपने ऑटोइनक्रिएटमेंट में वृद्धि के बारे में सावधान रहें - हुड के तहत यह सिर्फ एक डिलीट, इंसर्ट है। –

+0

यह मेरे लिए बहुत अच्छा काम करता है, अद्वितीय सूचकांक होना चाहिए – Gordon

0

MySQL REPLACE INTO http://dev.mysql.com/doc/refman/5.0/en/replace.html प्रदान करता है:

वास्तव में सम्मिलित करें, की तरह काम करता है, सिवाय इसके कि REPLACE तालिका में एक पुराने पंक्ति या प्राथमिक कुंजी के लिए एक नई पंक्ति एक अद्वितीय सूचकांक, जितना समान मान है, तो नई पंक्ति डालने से पहले पुरानी पंक्ति हटा दी गई है।

3

एक मामूली संशोधन/naeblis के जवाब के अलावा:

INSERT INTO table (email) VALUES (email_address) 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

इस तरह आप वहाँ में email=email_address फेंक और की जरूरत नहीं है आप LAST_INSERT_ID() अगर बयान के अपडेट के लिए सही मान मिलता है।

स्रोत: MySQL डॉक्स: 12.2.5.3