चाक चाक कंस्ट्रक्शन के साथ क्या है?


18

मेरे पास कुछ स्वतः-निर्मित टी-एसक्यूएल है, जो संभवतः मान्य है, लेकिन मुझे वास्तव में समझ में नहीं आता है।

ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];

मुझे पता है कि एक विदेशी कुंजी बाधा क्या है, लेकिन क्या है CHECK CHECK?

जवाबों:


29

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", कॉलम 'सहायता' में संघर्ष हुआ।

1
धन्यवाद। राइट ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; -- enable constraint without checking, क्या इसका मतलब यह होगा कि बाधा मौजूदा डेटा, केवल नए आने वाले डेटा की जांच नहीं करेगी?
बैंकेसन

1
बिल्कुल सही। देखें कि अगली प्रविष्टि (सहायता = 6) की अनुमति कैसे नहीं है लेकिन मौजूदा पंक्तियाँ (सहायता = 4 के साथ) अभी भी हैं।
ypercube y

जो इसे पूरी तरह प्रदर्शित करता है।
बैंकेसन

1

लेख को यहां पढ़ने पर विचार करें: 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

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