मान लीजिए कि हमारे पास एक मेज है जो अपने आप में एक विदेशी कुंजी बाधा है, जैसे:
CREATE TABLE Foo
(FooId BIGINT PRIMARY KEY,
ParentFooId BIGINT,
FOREIGN KEY([ParentFooId]) REFERENCES Foo ([FooId]) )
INSERT INTO Foo (FooId, ParentFooId)
VALUES (1, NULL), (2, 1), (3, 2)
UPDATE Foo SET ParentFooId = 3 WHERE FooId = 1
इस तालिका में निम्नलिखित रिकॉर्ड होंगे:
FooId ParentFooId
----- -----------
1 3
2 1
3 2
ऐसे मामले हैं जहां इस तरह की डिज़ाइन समझ में आ सकती है (जैसे कि विशिष्ट "कर्मचारी-और-बॉस-कर्मचारी" संबंध), और किसी भी मामले में: मैं ऐसी स्थिति में हूं जहां मेरे स्कीमा में यह है।
इस तरह का डिज़ाइन दुर्भाग्य से डेटा रिकॉर्ड में परिपत्रता की अनुमति देता है, जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है।
मेरा प्रश्न तब है:
- क्या यह जांच करने के लिए एक बाधा लिखना संभव है? तथा
- क्या इस पर जाँच करने वाली बाधा लिखना संभव है? (यदि केवल एक निश्चित गहराई तक आवश्यक हो)
इस सवाल के भाग (2) के लिए यह उल्लेख करना प्रासंगिक हो सकता है कि मैं केवल सैकड़ों या शायद कुछ मामलों में अपनी तालिका में हजारों रिकॉर्ड की उम्मीद करता हूं, आमतौर पर लगभग 5 से 10 स्तरों से अधिक गहरा कोई भी नहीं।
पुनश्च। एमएस SQL सर्वर 2008
14 मार्च 2012
को अपडेट करें कई अच्छे उत्तर थे। मैंने अब उस एक को स्वीकार कर लिया है जिसने मुझे उल्लेखित संभावना / व्यवहार्यता को समझने में मदद की है । हालांकि, कई अन्य शानदार जवाब हैं, कुछ कार्यान्वयन सुझावों के साथ भी, इसलिए यदि आप एक ही प्रश्न के साथ यहां उतरे हैं तो सभी उत्तरों पर एक नज़र डालें;)