2008-10-23 14 views
5

मैं इस तरह की तालिका में दो फ़ील्ड पर कुशलता से एक अद्वितीय अनुक्रमणिका कैसे बना सकता हूं: तालिका टी (एक पूर्णांक, बी पूर्णांक) बनाएं;दो फ़ील्ड पर 'दो तरफा' अद्वितीय इंडेक्स कैसे बनाएं?

जहां तालिका में एक ही पंक्ति पर दो अलग-अलग संख्याओं का कोई अद्वितीय संयोजन एक से अधिक बार प्रकट नहीं हो सकता है।

शब्दों में अगर कोई पंक्ति मौजूद है जैसे = 1 और बी = 2, एक और पंक्ति मौजूद नहीं हो सकती है जहां एक = 2 ​​और बी = 1 या ए = 1 और बी = 2। दूसरे शब्दों में दो संख्या किसी भी क्रम में एक से अधिक बार प्रकट नहीं हो सकती हैं।

मुझे नहीं पता कि इस तरह की बाधा कहलाती है, इसलिए शीर्षक में 'दो तरफा अद्वितीय सूचकांक' नाम।

अद्यतन: यदि मेरे पास कॉलम (ए, बी), और एक पंक्ति (1,2) डेटाबेस पर एक समग्र कुंजी है, तो त्रुटि के बिना एक और पंक्ति (2,1) डालना संभव है । क्या मैं के लिए देख रहा हूँ से संख्या की एक ही जोड़ी को रोकने के लिए एक तरह से इस्तेमाल किया जा रहा से एक बार फिर किसी भी क्रम में ...

उत्तर

5

तालिका में क्या होता है इसे नियंत्रित करने के बारे में कैसे है ताकि आप हमेशा सबसे छोटे नंबर को पहले कॉलम में स्टोर कर सकें और दूसरे में सबसे बड़ा स्टोर कर सकें? जब तक यह निश्चित रूप से 'वही बात' का मतलब है। डाटाबेस तक पहुंचने से पहले यह संभवतः कम करने के लिए महंगा है।

COLUMN A : 2 
COLUMN B : 1 

COLUMN A_PK : 1 (if new.a < new.b then new.a else new.b) 
COLUMN B_PK : 2 (if new.b > new.a then new.b else new.a) 

:

यदि यह असंभव है, आप फ़ील्ड के रूप में लेकिन उन्हें जिस पर आप प्राथमिक कुंजी बनाना होगा दो अन्य क्षेत्रों (छद्म कोड-ish) में संख्यात्मक क्रम में दोहराया गया है बचत हो सकती है यह आसानी से एक ट्रिगर (रोनाल्ड की प्रतिक्रिया में) के साथ किया जा सकता है या आवेदन में, ऊपर उठाया जा सकता है।

+0

आपका पहला जवाब मेरे लिए सही है। धन्यवाद। मैं उम्मीद कर रहा था कि एक और 'प्राकृतिक' समाधान होगा, लेकिन मुझे लगता है कि यह यह है। –

3

देखें मुझे लगता है कि यह केवल उपयोग किया जा सकता है एक इंसर्ट ट्रिगर (दो स्तंभों पर एक अद्वितीय बाधा के साथ संयोजन में)। मैं वास्तव में MySql वाक्य रचना (मेरी T-SQL बेहतर है) में धाराप्रवाह नहीं कर रहा हूँ, इसलिए मुझे लगता है कि निम्नलिखित कुछ त्रुटियों में शामिल होंगे:

संपादित करें: वाक्य रचना ऊपर साफ़ किया तो यह MySQL के लिए काम करता है। साथ ही, ध्यान दें कि आप इसे BEFORE UPDATE ट्रिगर भी (निश्चित रूप से एक अलग नाम के साथ) के रूप में रखना चाहते हैं।

इसके अलावा, यह विधि दो क्षेत्रों पर प्राथमिक या अन्यथा अद्वितीय कुंजी रखने पर निर्भर करती है (यानी यह ट्रिगर केवल जांच करता है कि रिवर्स पहले से मौजूद नहीं है।) कोई त्रुटि फेंकने का कोई तरीका नहीं प्रतीत होता है एक ट्रिगर से, इसलिए मुझे हिम्मत है कि यह उतना अच्छा है जितना इसे मिलता है।

CREATE TRIGGER tr_CheckDuplicates_insert 
BEFORE INSERT ON t 
FOR EACH ROW 
BEGIN 
    DECLARE rowCount INT; 
    SELECT COUNT(*) INTO rowCount 
        FROM t 
        WHERE a = NEW.b AND b = NEW.a; 

    IF rowCount > 0 THEN 
     -- Oops, we need a temporary variable here. Oh well. 
     -- Switch the values so that the key will cause the insert to fail. 
     SET rowCount = NEW.a, NEW.a = NEW.b, NEW.b = rowCount; 
    END IF; 
END; 
+0

MySQL के तहत फिक्स्ड अप और परीक्षण किया गया।अगर किसी को पता है कि डालने से रोकने के लिए सीधे एक ट्रिगर से त्रुटि फेंकना संभव है, तो यह जानना आसान होगा ... –

2

ओरेकल में आप इस तरह एक समारोह आधारित सूचकांक इस्तेमाल कर सकते हैं:

create unique index mytab_idx on mytab (least(a,b), greatest(a,b)); 

मैं mySQL पता नहीं है, लेकिन शायद ऐसा ही कुछ हो सकता है? उदाहरण के लिए, आप कम से कम (ए, बी) और महानतम (ए, बी) के मानों के साथ क्रमशः बनाए रखने के लिए एक ट्रिगर के साथ तालिका में 2 नए कॉलम कम से कम और maxabab जोड़ सकते हैं, और फिर एक अनन्य अनुक्रमणिका बना सकते हैं (minimalab , महानतम)।

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