SQL सर्वर में एक ही स्तंभ पर कई विदेशी कुंजियों का उपयोग


10

SQL सर्वर मुझे एक स्तंभ पर कई विदेशी कुंजी बनाने की अनुमति देता है, और हर बार बस अलग-अलग नाम का उपयोग करके मैं एक ही ऑब्जेक्ट के लिए एक और कुंजी संदर्भ बना सकता हूं। मूल रूप से सभी चाबियाँ एक ही रिश्ते को परिभाषित कर रही हैं। मैं यह जानना चाहता हूं कि एक ही कॉलम पर परिभाषित कई विदेशी कुंजियों के उपयोग का क्या मतलब है और दूसरी तालिका में उसी कॉलम के संदर्भ में। इसका क्या फायदा है कि एसक्यूएल सर्वर हमें ऐसा काम करने की अनुमति देता है?

यहाँ छवि विवरण दर्ज करें

जवाबों:


12

निरर्थक बाधाओं के होने का कोई लाभ नहीं है जो केवल नाम से भिन्न हैं। इसी तरह, निरर्थक अनुक्रमित होने का कोई लाभ नहीं है जो केवल नाम से भिन्न होता है। दोनों बिना मूल्य के ओवरहेड जोड़ते हैं।

SQL सर्वर डेटाबेस इंजन आपको ऐसा करने से नहीं रोकता है। अच्छा बाधा नामकरण बाधा नामकरण परंपराएं (जैसे FK_ReferencingTable_ReferencedTable) ऐसी गलतियों से बचाने में मदद कर सकती हैं।


17

SQL सर्वर आपको बहुत सारी मूर्खतापूर्ण चीजें करने की अनुमति देता है।

आप खुद को संदर्भित करते हुए एक कॉलम पर एक विदेशी कुंजी भी बना सकते हैं - इस तथ्य के बावजूद कि इसका उल्लंघन कभी नहीं किया जा सकता है क्योंकि प्रत्येक पंक्ति स्वयं पर बाधा को पूरा करेगी।

एक किनारे का मामला जहां एक ही रिश्ते पर दो विदेशी चाबियाँ बनाने की क्षमता संभावित रूप से उपयोगी होगी, क्योंकि विदेशी कुंजी को मान्य करने के लिए उपयोग किए जाने वाले सूचकांक का निर्माण समय पर किया जाता है। यदि बाद में एक बेहतर (संकरा) सूचकांक आता है, तो यह एक नई विदेशी कुंजी बाधा को बेहतर सूचकांक पर बाध्य करने की अनुमति देगा और फिर मूल बाधा बिना किसी सक्रिय बाधा के कोई अंतर नहीं है।

(नीचे उदाहरण में)

CREATE TABLE T1(
    T1_Id INT PRIMARY KEY CLUSTERED  NOT NULL,
    Filler CHAR(4000) NULL,
) 

INSERT INTO T1 VALUES (1, '');

CREATE TABLE T2(
    T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id), 
    Filler CHAR(4000) NULL,
)


ALTER TABLE T1 ADD CONSTRAINT
    UQ_T1 UNIQUE NONCLUSTERED(T1_Id) 


/*Execution Plan uses clustered index*/ 
INSERT INTO T2 VALUES (1,1) 

ALTER TABLE T2  WITH CHECK ADD  CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)    

ALTER TABLE T2 DROP CONSTRAINT FK

/*Now Execution Plan now uses non clustered index*/    
INSERT INTO T2 VALUES (1,1)    

DROP TABLE  T2, T1;

अंतरिम अवधि के लिए एक तरफ के रूप में, जबकि दोनों बाधाओं में किसी भी आवेषण का अंत होता है, जो दोनों अनुक्रमितों के खिलाफ मान्य होता है।


क्या समान अंतरहीन अद्यतन को सुनिश्चित करने के लिए लेनदेन का उपयोग किया जा सकता है? कम लॉकिंग के कारण क्या यह गैर-लेनदेन पद्धति बेहतर है, शायद?
बिंकी

13

समान विदेशी प्रमुख बाधाओं के लिए कोई उपयोग नहीं है। यह एक ही कॉलम और एक ही टेबल और कॉलम को संदर्भित करता है।

यह एक ही चेक 2 या अधिक बार होने जैसा है।


-इस बात से सहमत नहीं। मौका हो सकता है कि प्राथमिक तालिका को दो अलग-अलग जांचों की आवश्यकता हो। नीचे देखें उदाहरण प्रेषक और रिसीवर बिलकुल अलग हैं - stackoverflow.com/questions/40400483/…
trex

@trex आप किसी दिन अलग के बारे में बात कर रहे हैं। यहाँ प्रश्न में कहा गया है: "मैं यह जानना चाहता हूं कि कई विदेशी कुंजियाँ रखने का क्या उपयोग है जो एक ही स्तंभ पर परिभाषित हैं और दूसरी तालिका में उसी स्तंभ के संदर्भ में हैं ।"
ypercube y

@ ypercube y - समझ गया। इसे स्पष्ट करने के लिए धन्यवाद
trex

6

समान कारण आप एक ही कॉलम पर 50 इंडेक्स बना सकते हैं, दूसरी लॉग फ़ाइल जोड़ सकते हैं, अधिकतम सर्वर मेमोरी को 20MB पर सेट कर सकते हैं ... अधिकांश लोग इन चीजों को नहीं करेंगे, लेकिन उन्हें कभी-कभी करने के लिए वैध कारण हो सकते हैं, इसलिए ऐसा नहीं है इंजन में ओवरहेड बनाने में लाभ उन चीजों के खिलाफ चेक जोड़ने के लिए है जो केवल बीमार हैं।


2

एक नीली-हरी चीज की तरह लगता है।

जब आप नीले से हरे रंग में कटौती करना शुरू करते हैं, तो आपको अस्थायी रूप से चीजों की अतिरिक्त प्रतियां बनाने की आवश्यकता होती है।

हम जो करना चाहते हैं, वह अस्थायी रूप से एक अतिरिक्त विदेशी कुंजी बनाना है CHECK WITH NOCHECKऔर ON UPDATE CASCADE ON DELETE SET NULL; यह क्या करता है यह एक काम करने वाली विदेशी कुंजी है लेकिन कुंजी बनाते समय मौजूदा पंक्तियों की जांच नहीं की जाती है।

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

ध्यान दें कि यदि आपने अभी-अभी विदेशी कुंजी को गिराया और पुनः बनाया है, तो कुछ कचरा पंक्तियाँ आपके द्वारा फिसल सकती हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.