2011-03-15 16 views
6

मान लीजिए कि मेरे पास दो कॉलम के साथ एक MySQL तालिका है: ए और बी। क्या यह एक अनूठी कुंजी हो सकती है ताकि मैं केवल ए या बी (पूरी तालिका में एक बार) में केवल एक बार मूल्य डाल सकूं?पूरे mysql तालिका पर अद्वितीय कुंजी?

तो यदि कॉलम ए में 'qwe' होता है और बी में 'asd' होता है तो इन दो मानों को या तो कॉलम में अब सम्मिलित नहीं किया जा सकता है।

इस काम नहीं करेगा:

UNIQUE KEY `A` (`A`,`B`), 
UNIQUE KEY `A_2` (`A`), 
UNIQUE KEY `B` (`B`), 
UNIQUE KEY `B_2` (`B`,`A`) 

धन्यवाद।

संपादित करें:

delimiter | 
create trigger unique_check before insert on mytable 
     for each row begin 
       declare alreadyexists integer; 
      select count(*) > 0 into alreadyexists from mytable 
       where A=NEW.B or B=NEW.A; 
      IF alreadyexists = 1 THEN begin 
      DECLARE dummy INT; 
     SELECT 'A OR B already exists' INTO dummy FROM mytable 
      WHERE nonexistent = 'value'; 
end; 
END IF; 
END;| 

हालांकि, मैं 'ए या बी पहले से मौजूद है' नहीं दिख रहा है त्रुटि संदेश है, लेकिन:

त्रुटि मैं निम्नलिखित ट्रिगर के साथ यह पूरा करने में सक्षम था 1054 (42 एस 22): 'खंड'

में अज्ञात कॉलम 'nonexistent' में अज्ञात कॉलम 'nonexistent'

+0

एक और विकल्प कॉलम 'मान',' ए', 'बी' के साथ 'ए' और' बी' बिट्स के साथ एक तालिका हो सकता है, और तब जब मान (जो अद्वितीय होना चाहिए) इनपुट है एक या बी को 1 भी सेट करता है। मुझे लगता है कि अगर कोई व्यक्ति 'ए' और 'बी' दोनों के लिए 1 में डालता है तो यह समस्या तब भी देता है, लेकिन यह एक और तरीका है – Harold

उत्तर

2

हाँ यह संभव है।

1 रास्ता

आप एक BEFORE INSERT ट्रिगर बनाएं और वापसी त्रुटि है, तो मूल्य पहले से ही अन्य स्तंभों/तालिकाओं में पाया जाता है की जरूरत है।

इस blog post

MySQL ट्रिगर से: आप एक सम्मिलित करें, अद्यतन कैसे गर्भपात या एक ट्रिगर के साथ हटा सकता हूँ? EfNet के #mysql पर पूछा गया:

यदि मेरा व्यवसाय नियम विफल रहता है तो मैं ऑपरेशन को निरस्त कैसे कर सकता हूं?

MySQL 5.0 और 5.1 आप कुछ प्रवंचना को सहारा की जरूरत है एक ट्रिगर असफल और एक सार्थक त्रुटि संदेश देने बनाने के लिए। MySQL संग्रहित प्रक्रिया पूछे जाने वाले प्रश्न इस बारे में त्रुटि से निपटने का कहना है:

सपा 11. क्या एस.पी. एक "आवेदन त्रुटियों को बढ़ाने के लिए" बयान "उठाना" है? क्षमा करें, वर्तमान में नहीं। एसक्यूएल मानक सिग्नल और रेजीनल स्टेटमेंट TODO पर हैं।

शायद MySQL 5.2 सिग्नल बयान जो इस हैक MySQL से सीधे चोरी संग्रहित प्रक्रिया प्रोग्रामिंग अप्रचलित कर देगा शामिल होंगे। क्या हैक है? आप MySQL को मौजूद कॉलम का उपयोग करने का प्रयास करने के लिए मजबूर करने जा रहे हैं। बदसूरत? हाँ। क्या यह काम करता है? ज़रूर।

CREATE TRIGGER mytabletriggerexample 
BEFORE INSERT 
FOR EACH ROW BEGIN 
IF(NEW.important_value) < (fancy * dancy * calculation) THEN 
    DECLARE dummy INT; 

    SELECT Your meaningful error message goes here INTO dummy 
     FROM mytable 
     WHERE mytable.id=new.id 
END IF; END; 

एक और तरीका है

तुम भी साथ Transactions

व्यवहार तालिका (InnoDB) में डेटा सम्मिलित करने के लिए लेन-देन के साथ एक प्रक्रिया का उपयोग कर सकते हैं,

ट्रिगर लिखने में त्रुटि की स्थिति पर:

set @error=1; 

इस तरह की प्रक्रिया कुछ में:

set @error=0; 
start transaction 
do insert 
if @error>0 then rollback; 
else commit; 
+0

आपकी मदद के लिए धन्यवाद, मैं इसे आज़माउंगा! – atlau

1

उचित (और सरल) रास्ता नहीं मिलता ए या बी से पहले शून्य मान प्राप्त करने के लिए कर सकता है यह संबंधपरक रूप से दो टेबल, टी 1 और टी 2 बनाने के लिए है, जहां टी 2 के पास टी 1 पर एक विदेशी कुंजी रिश्ते (कई से एक) है। अद्वितीय सूचकांक/बाधा T2.yourUniqueColumn पर घोषित किया जाता है, और यदि आप उस स्तंभ में मानों के बीच अंतर करना चाहिए, टी 2 के लिए एक और कॉलम जोड़ें:

T1 
    id 
    foo 


    T2 
    t2id 
    t1id fk references T1 
    yourUniqueColumn [unique index/constraint] 
    extraColumnToDescribeTheValueInUniqueColumn  

आप शुरू में इस तरह से टी 2 पॉप्युलेट सकता है (मान लिया गया ऑटो incrementing टी 2 में पी):

insert into T2 
    (t1id, yourUniqueColumn, extraColumn) 
    select t1.id as t1id, T1.A as yourUniqueColumn, 'A' as extraColumn from T1 


    insert into T2 
    (t1id, yourUniqueColumn, extraColumn) 
    select T1.id as t1id, T1.B as yourUniqueColumn, 'B' as extraColumn from T1 

एक नियम के-अंगूठे, जब भी आप अपने आप को बातें procedurally जब एक संबंधपरक डेटाबेस के साथ काम कर रही है लगता है के रूप में, यह एक कदम पीछे जाएं और पुनर्रचना के विचार करने के लिए समय है।

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