जवाबों:
MSDN दस्तावेज़ीकरण पृष्ठ ALTER TABLEइन के बारे में बताते हैं:
ALTER TABLE: तालिका की संरचना को संशोधित करें CHECK CONSTRAINT ..: बाधा को सक्षम करेंNOCHECK CONSTRAINT ..: बाधा WITH CHECK: बाधा की भी जाँच करेंWITH NOCHECK: बाधा की जाँच न करेंउनके शब्दों में:
| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT { ALL | constraint_name [ ,...n ] }...
WITH CHECK | WITH NOCHECKनिर्दिष्ट करता है कि क्या तालिका में डेटा एक नए जोड़े या फिर से सक्षमFOREIGN KEYयाCHECKबाधा के खिलाफ मान्य नहीं है । यदि निर्दिष्ट नहींWITH CHECKकिया गया है, तो नए अवरोधों के लिए मान लिया गया है, औरWITH NOCHECKफिर से सक्षम बाधाओं के लिए मान लिया गया है।यदि आप मौजूदा डेटा के खिलाफ नए
CHECKयाFOREIGN KEYबाधाओं का सत्यापन नहीं करना चाहते हैं , तो उपयोग करेंWITH NOCHECK। हम ऐसा करने की अनुशंसा नहीं करते हैं, सिवाय दुर्लभ मामलों में। नए बाधा का मूल्यांकन बाद के सभी डेटा अपडेट में किया जाएगा।WITH NOCHECKजब बाधा जोड़ी जाती है तो किसी भी बाधा का उल्लंघन हो सकता है यदि वे डेटा के साथ पंक्तियों को अद्यतन करते हैं जो बाधा का अनुपालन नहीं करते हैं तो भविष्य के अद्यतन विफल हो सकते हैं।क्वेरी ऑप्टिमाइज़र परिभाषित किए गए अवरोधों पर विचार नहीं करता है
WITH NOCHECK। ऐसे अवरोधों को तब तक अनदेखा किया जाता है जब तक वेALTER TABLEतालिका का उपयोग करके पुनः सक्षम नहीं हो जाते हैंWITH CHECK CHECK CONSTRAINT ALL।...
{ CHECK | NOCHECK } CONSTRAINT
निर्दिष्ट करता है कि constraint_name सक्षम या अक्षम है। यह विकल्प केवलFOREIGN KEYऔरCHECKबाधाओं के साथ इस्तेमाल किया जा सकता है । जबNOCHECKनिर्दिष्ट किया जाता है, तो बाधा को अक्षम किया जाता है और स्तंभ के लिए भविष्य के आवेषण या अपडेट को बाधा स्थितियों के खिलाफ मान्य नहीं किया जाता है।DEFAULT,PRIMARY KEYऔरUNIQUEबाधाओं को अक्षम नहीं किया जा सकता है।
Dbfiddle में टेस्ट :
CREATE TABLE a (aid INT PRIMARY KEY);जाओ
✓
INSERT INTO a (aid) VALUES (1), (2), (3) ;जाओ
3 पंक्तियां प्रभावित
CREATE TABLE b ( aid INT, bid INT PRIMARY KEY, CONSTRAINT [My_FORIEGN_KEY] FOREIGN KEY (aid) REFERENCES a (aid) ) ;जाओ
✓
INSERT INTO b (aid, bid) VALUES (1, 11), (1, 12), (2, 21), (3, 31) ;जाओ
4 पंक्तियां प्रभावित
INSERT INTO b (aid, bid) VALUES (6, 61), (6, 62) ;जाओ
Msg 547 लेवल 16 स्टेट 0 लाइन 1 INSERT स्टेटमेंट ने FOREIGN KEY बाधा "My_FORIEGN_KEY" के साथ विवाद किया। डेटाबेस "fiddle_792fce5de09f42908c3a0f91421f3522", तालिका "dbo.a", कॉलम 'सहायता' में संघर्ष हुआ। Msg 3621 लेवल 0 स्टेट 0 लाइन 1 बयान समाप्त कर दिया गया है।
SELECT * FROM b ;जाओ
सहायता | बोली -: | -: 1 | 1 1 1 | 12 2 | 21 3 | 31
ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY]; --disableजाओ
✓
INSERT INTO b (aid, bid) VALUES (4, 41), (4, 42) ;जाओ
2 पंक्तियाँ प्रभावित
SELECT * FROM b ;जाओ
सहायता | बोली -: | -: 1 | 1 1 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking existing dataजाओ
✓
SELECT * FROM b ;जाओ
सहायता | बोली -: | -: 1 | 1 1 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
INSERT INTO b (aid, bid) VALUES (6, 61), (6, 62) ;जाओ
Msg 547 लेवल 16 स्टेट 0 लाइन 1 INSERT स्टेटमेंट ने FOREIGN KEY बाधा "My_FORIEGN_KEY" के साथ विवाद किया। डेटाबेस "fiddle_792fce5de09f42908c3a0f91421f3522", तालिका "dbo.a", कॉलम 'सहायता' में संघर्ष हुआ। Msg 3621 लेवल 0 स्टेट 0 लाइन 1 बयान समाप्त कर दिया गया है।
SELECT * FROM b ;जाओ
सहायता | बोली -: | -: 1 | 1 1 1 | 12 2 | 21 3 | 31 4 | 41 4 | 42
ALTER TABLE b WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- check existing data and enable constraintजाओ
Msg 547 लेवल 16 स्टेट 0 लाइन 1 पूर्व सारणी कथन के साथ FOREIGN प्रमुख बाधा "My_FORIEGN_KEY" का विरोध किया गया। डेटाबेस "fiddle_792fce5de09f42908c3a0f91421f3522", तालिका "dbo.a", कॉलम 'सहायता' में संघर्ष हुआ।
लेख को यहां पढ़ने पर विचार करें: https://msdn.microsoft.com/en-us/library/ms190273.aspx
यह हमें बताता है: 'क्वेरी ऑप्टिमाइज़र NOCHECK के साथ परिभाषित बाधाओं को नहीं मानता है। इस तरह की बाधाओं को तब तक नजरअंदाज किया जाता है, जब तक कि वे CHECK CHECK CONSTINT 'के साथ ALTER TABLE तालिका का उपयोग करके फिर से सक्षम न हो जाएं।
इसके अलावा, StackOverflow पर थि थ्रेड पर विचार करें : /programming/529941/with-check-add-constraint-followed-by-check-constraint-vd-add-constraint
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking, क्या इसका मतलब यह होगा कि बाधा मौजूदा डेटा, केवल नए आने वाले डेटा की जांच नहीं करेगी?