Use multiple columns as unique identifier for mysql -


मेरे पास निम्न कॉलम के साथ एक mysql तालिका है:

  group_id game_id user_id last_update < / कोड>  

मैं इसे ऐसा करना चाहता हूं ताकि कोई दो पंक्तियां मौजूद न हों, जहां पंक्ति x के लिए group_id का मान पंक्ति के लिए group_id के मान के बराबर है और पंक्ति के लिए user_id का मान भी x है पंक्ति के लिए user_id के मान के बराबर।

तो, उदाहरण के लिए, मान लें कि मैं निम्नलिखित निम्न मान डालें:

  group_id = 783 game_id = 34 user_id = 29237 उपरोक्त डेटा, भले ही एक mysql क्वेरी इसे सम्मिलित करने का प्रयास करती है, एक पंक्ति बना नहीं है, अगर पंक्ति पहले से मौजूद है तो group_id और user_id के समान संयोजन के साथ मौजूद है। । क्या इसे करने का कोई तरीका है? असल में, मैं दो स्तंभों को एक अनूठे इंडेक्स की तरह एक साथ काम करने की कोशिश कर रहा हूं।   

हाँ , MySQL ऐसा करने की क्षमता प्रदान करता है।

  वैकल्पिक तालिका MyTable UNIQUE कुंजी 'my_unique_key` (`group_id`,` user_id`)  

जोड़ें पता नहीं है कि आप इस तालिका का उपयोग किस लिए कर रहे हैं, लेकिन ऐसा लगता है कि यह अनूठी कुंजी तालिका की प्राथमिक कुंजी के लिए एक मजबूत उम्मीदवार हो सकता है। एक प्राथमिक कुंजी स्वतः ही एक अद्वितीय कुंजी है यदि आप इसे प्राथमिक कुंजी बनाने का निर्णय लेते हैं, तो इसके बजाय निम्नलिखित करें:

  वैकल्पिक तालिका MyTable प्राथमिक कुंजी जोड़ें (`group_id`,` user_id`)  
< P> (यदि आप एक त्रुटि संदेश प्राप्त करते हैं कि पहले से ही एक प्राथमिक कुंजी है, तो फिर वैकल्पिक तालिका MyTable DROP प्राथमिक कुंजी जारी करें और उसके बाद उपरोक्त आदेश को दोहराएं।)

संपादित करें: उपयोगकर्ता टिप्पणी के जवाब में

आपके पास अनन्य कुंजी द्वारा कवर किए गए कॉलम के समान गैर- NULL मान के साथ कई पंक्तियाँ नहीं हो सकतीं इसलिए आपके पास दो पंक्तियाँ नहीं हो सकती हैं, जहां group_id = 0 और user_id = 5 , उदाहरण के लिए। 0 एक मूल्य है लेकिन अगर आप एक या दोनों कॉलम बनाते हैं, तो आप हो सकते हैं में कई पंक्तियाँ होती हैं जो कि NULL s की स्थिति के समान होती हैं तो आपके पास दो (या अधिक) पंक्तियाँ हो सकती हैं, जहां group_id is NULL और user_id = 1234

Proviso: उपरोक्त दोनों सामान्यतः उपयोग किए जाने वाले MySQL भंडारण इंजन (MyISAM और InnoDB)। MySQL में भंडारण इंजन हैं जिसमें NULL एक अनन्य मान के रूप में माना जाता है, लेकिन आप संभवतः उनका उपयोग नहीं कर रहे हैं।

यदि आप एक या दोनों कॉलम बना सकते हैं, तो आपकी अद्वितीय कुंजी प्राथमिक कुंजी नहीं हो सकती - एक प्राथमिक कुंजी को कॉलम पर होना चाहिए जो कि NOT NULL है।

मान लीजिए कि आपने यह कुंजी अपनी प्राथमिक कुंजी बना दी थी और अब आप < कोड> नल में group_id कॉलम। मुझे नहीं पता कि डेटाटाइप group_id फिलहाल है; मुझे लगता है कि यह वर्तमान में INT को अनअकेड नहीं है , लेकिन यदि आपको यह नहीं है तो आपको नीचे संशोधित करना होगा। आप इस कुंजी को अपनी प्राथमिक कुंजी के रूप में उपयोग नहीं कर पाएंगे। यहां एक कमांड है जो आप वांछित परिवर्तन करने के लिए चला सकते हैं:

  वैकल्पिक तालिका MyTable ड्रॉप प्राथमिक कुंजी, संशोधित करें group_id INT UNAIGNED, अद्वितीय कुंजी जोड़ें 'my_unique_key_with_nulls` (`group_id`,` उपयोगकर्ता`)  

Comments