जवाबों:
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
, क्या इसका मतलब यह होगा कि बाधा मौजूदा डेटा, केवल नए आने वाले डेटा की जांच नहीं करेगी?