2016-12-08 8 views
5

मेरे पास MySQL में निम्न तालिका कॉलम हैं।दो स्तंभों के संयोजन के लिए द्वि-दिशात्मक अद्वितीय कुंजी बाधा

id 
user_primary_email 
user_secondary_email 

मैं सिर्फ एक जोड़कर UNIQUE KEY unique_key_name (user_primary_email, user_secondary_email)

अद्वितीय कुंजी बाधा के ऊपर इसके अलावा का उपयोग करके कॉलम user_primary_email और user_secondary_email अद्वितीय जो मैं प्राप्त कर सकते हैं के संयोजन बनाने के लिए मुझे नीचे परिदृश्य को प्राप्त या बल्कि मदद मिलेगी चाहते व्यक्तिगत कॉलम के लिए अद्वितीय कुंजी।

user_primary_email = '[email protected]' AND user_secondary_email = '[email protected]' 
user_primary_email = '[email protected]' AND user_secondary_email = '[email protected]' //This will not be allowed to enter due to unique key constraint 

अब जिस समस्या का सामना कर रहा हूं वह वही संयोजन है जैसा नीचे उल्लिखित उल्टा तरीके से जोड़ने की अनुमति नहीं दी जानी चाहिए।

user_primary_email = '[email protected]' AND user_secondary_email = '[email protected]' //This should not be allowed to add since already same email id combination added once 

id | user_primary_email | user_secondary_email 
------------------------------------------------------- 
1  | [email protected]  | [email protected] 
------------------------------------------------------- 
2  | [email protected]  | [email protected]  
------------------------------------------------------- 

पंक्ति आईडी 2 के डालने के दौरान उपरोक्त मामले में यह दोनों ईमेल आईडी संयोजन के रूप में त्रुटि फेंक चाहिए पहले से ही पंक्ति आईडी 1 में प्रयोग किया जाता है।

कोई भी मदद महान होगी।

+0

जांच बाधा? http://www.w3schools.com/sql/sql_check.asp – Kritner

+0

यह इस परिदृश्य में काम नहीं करेगा। – user850234

+0

आह, क्षमा करें मुझे mysql के बारे में निश्चित नहीं है। मुझे एसक्यूएल सर्वर में पता है कि आप एक ऐसे फ़ंक्शन को लिख सकते हैं जिसमें उसके भीतर एक क्वेरी है जिसे चेक बाधा में रखा जा सकता है ... मुझे लगता है कि यह mysql के लिए मौजूद नहीं है? – Kritner

उत्तर

4

किसी भी MariaDB में:

CREATE TABLE `t` (
    `id` int(11) NOT NULL, 
    `user_primary_email` varchar(64) DEFAULT NULL, 
    `user_secondary_email` varchar(64) DEFAULT NULL, 
    `mycheck` varchar(128) AS (IF(user_primary_email<user_secondary_email,CONCAT(user_primary_email,user_secondary_email),CONCAT(user_secondary_email,user_primary_email))) PERSISTENT, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `mycheck` (`mycheck`) 
); 

MariaDB [test]> insert into t values (1,'a','b',null); 
Query OK, 1 row affected (0.03 sec) 

MariaDB [test]> insert into t values (2,'b','a',null); 
ERROR 1062 (23000): Duplicate entry 'ab' for key 'mycheck' 
3

इसके लिए कोई सीधा समर्थन नहीं है, लेकिन आप अपनी बिडरेक्शनल कुंजी बनाने के लिए एक वर्कअराउंड का उपयोग कर सकते हैं: आपको अपने दो कॉलम के ऑर्डर किए गए संस्करण पर एक अनन्य कुंजी चाहिए।

सौभाग्य से, आप इसे आसानी से कर सकते हैं। MySQL 5.7.6+ उनके लिए जेनरेट किए गए कॉलम और अद्वितीय इंडेक्स का समर्थन करता है, जिसका उपयोग आप अपने दो मानों को ऑर्डर करने और विशिष्टता को लागू करने के लिए कर सकते हैं।

create table testBiDirKey (
    a varchar(100), 
    b varchar(100), 
    a_ordered varchar(100) as (least(a, b)) STORED, 
    b_ordered varchar(100) as (greatest(a, b)) STORED, 
    unique key unqBi_test_ab (a_ordered, b_ordered) 
); 

insert into testBiDirKey(a,b) values('a', 'b'); 
insert into testBiDirKey(a,b) values('b', 'a'); 
Error Code: 1062. Duplicate entry 'a-b' for key 'unqBi_test_ab' 

यह null वास्तव में व्यवहार करेगा अपने वर्तमान सामान्य अद्वितीय कुंजी के रूप में है, तो

insert into testBiDirKey(a,b) values('a', null); 
insert into testBiDirKey(a,b) values('a', null); 
insert into testBiDirKey(a,b) values(null, 'a'); 

सभी की अनुमति है। यदि आप चाहते हैं तो आप केवल एक खाली मूल्य (या तो null या '') को अनुमति देने के लिए coalesce(x,'') जोड़ सकते हैं। यदि आप उन्हें जोड़ने से पहले अपने मानों को सत्यापित करते हैं (उदाहरण के लिए यदि उनमें , नहीं है), तो आप दो कॉलम को , से संयोजित कर सकते हैं - हालांकि केवल 1 अतिरिक्त कॉलम के अलावा थोड़ा लाभ के साथ।

5.7.8+ के लिए, आपको सूचकांक में इन कॉलम का उपयोग करने में सक्षम होने के लिए STORED कीवर्ड की आवश्यकता नहीं है। वह कीवर्ड प्रभाव यदि मान संग्रहीत किए जाते हैं (डिस्क स्थान का उपयोग कर) या आवश्यकता होने पर गणना की जाती है (डिफ़ॉल्ट)।

MySQL 5.7.6 से पहले, आप इन मानों के साथ दो कॉलम अपडेट करने के लिए एक ट्रिगर (update और insert पर) का उपयोग कर सकते हैं, वही तर्क लागू होता है, यह थोड़ा और कोड है।

+0

स्पष्ट स्पष्टीकरण के साथ महान उत्तर ... मैं मारियाडीबी का उपयोग कर रहा हूं इसलिए उपर्युक्त उत्तर स्वीकार कर रहा हूं ... लेकिन आपके उत्तर को भी ऊपर उठाना क्योंकि यह दूसरों के लिए बहुत उपयोगी होगा ... धन्यवाद – user850234

संबंधित मुद्दे