SQL सर्वर में आप एक CHECK
बना सकते हैं एक या अधिक स्तंभों में स्वीकार्य डेटा मान निर्दिष्ट करने के लिए तालिका में बाधा।
अगर किसी टेबल में CHECK
है उस पर प्रतिबंध, और आप डेटा प्रदान करने का प्रयास करते हैं जो CHECK
. के अनुरूप नहीं है बाधा, ऑपरेशन एक त्रुटि के साथ विफल हो जाएगा।
यह डेटा अखंडता को बनाए रखने में मदद करता है, क्योंकि यह अमान्य डेटा को डेटाबेस में प्रवेश करने से रोकने में मदद करता है।
जब आप एक CHECK
. बनाते हैं बाधा, आप एक तार्किक अभिव्यक्ति प्रदान करते हैं जो TRUE
. देता है या FALSE
. इस तार्किक अभिव्यक्ति का उपयोग डेटा की जांच के लिए किया जाता है।
CHECK
बाधाएं विदेशी कुंजी बाधाओं के समान हैं क्योंकि वे एक कॉलम में रखे गए मानों को नियंत्रित करते हैं। हालांकि, अंतर यह है कि वे कैसे निर्धारित करते हैं कि कौन से मान मान्य हैं:विदेशी कुंजी बाधाएं किसी अन्य तालिका से मान्य मानों की सूची प्राप्त करती हैं, जबकि CHECK
बाधाएँ तार्किक व्यंजक से मान्य मान निर्धारित करती हैं।
बाधाओं को स्तंभ स्तर या तालिका स्तर पर परिभाषित किया जा सकता है। स्तंभ-स्तर की बाधा उस स्तंभ के केवल डेटा पर लागू होती है। तालिका-स्तर की बाधा पूरी पंक्ति पर लागू होती है, और कई स्तंभों के डेटा की जांच करती है।
नीचे कॉलम-लेवल और टेबल-लेवल दोनों बनाने के उदाहरण दिए गए हैं CHECK
बाधाएं।
उदाहरण 1 - एक कॉलम-लेवल चेक बाधा बनाएं
यहां एक बुनियादी स्तंभ-स्तर बनाने का एक उदाहरण दिया गया है CHECK
तालिका बनाते समय बाधा।
CREATE TABLE ConstraintTest ( ConstraintTestId int IDENTITY(1,1) NOT NULL PRIMARY KEY, Price smallmoney NOT NULL, CONSTRAINT chkPrice CHECK (Price > 0) );
इस मामले में, CHECK
बाधा निर्दिष्ट करती है कि Price
. में सभी डेटा कॉलम 0 से बड़ा होना चाहिए। दूसरे शब्दों में, कीमत शून्य नहीं हो सकती और यह नकारात्मक नहीं हो सकती। यह एक स्तंभ-स्तरीय बाधा है क्योंकि यह एक स्तंभ के डेटा पर लागू होता है।
क्योंकि यह एक स्तंभ-स्तर की बाधा है, मैं इसे स्तंभ के भाग के रूप में परिभाषित कर सकता था (अल्पविराम के बिना)। तो मैं यह कर सकता था:
CREATE TABLE ConstraintTest ( ConstraintTestId int IDENTITY(1,1) NOT NULL PRIMARY KEY, Price smallmoney NOT NULL CONSTRAINT chkPrice CHECK (Price > 0) );
किसी भी तरह से, आइए अमान्य मान डालने का प्रयास करें:
INSERT INTO ConstraintTest ( Price ) VALUES ( 0 );. में डालें
परिणाम:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'Price'.
उदाहरण 2 - अधिक कॉलम जोड़ें और एक अन्य कॉलम-स्तरीय चेक बाधा जोड़ें
आइए अपनी तालिका में कुछ और कॉलम जोड़ें और फिर एक और कॉलम-स्तर जोड़ें CHECK
बाधा।
ALTER TABLE ConstraintTest ADD TeamSize tinyint NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, CONSTRAINT chkTeamSize CHECK (TeamSize >= 3 AND TeamSize <= 15) ;
नए कॉलम में से एक टीम के सदस्यों की संख्या रिकॉर्ड करता है। इस मामले में, व्यावसायिक नियम यह है कि एक टीम में कम से कम 3 सदस्य होने चाहिए, लेकिन 15 से अधिक नहीं। इसलिए डेटाबेस को उस स्थिति को रोकना चाहिए जहां एक टीम में 3 से कम या 15 से अधिक सदस्य हों।
आइए अमान्य मान डालने का प्रयास करें:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 2, '2020-01-01', '1900-02-02' );
परिणाम:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkTeamSize". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'TeamSize'.
उदाहरण 3 - एक टेबल-लेवल चेक बाधा जोड़ें
अब एक टेबल-स्तरीय बाधा जोड़ें। यह दो कॉलम में डेटा की जांच करेगा।
वैसे, CHECK
. जोड़ने के लिए आपको कोई अन्य कॉलम जोड़ने की आवश्यकता नहीं है बाधा आप बस अपने आप ही बाधा जोड़ सकते हैं।
उदाहरण:
ALTER TABLE ConstraintTest ADD CONSTRAINT chkValidEndDate CHECK (EndDate >= StartDate) ;
इस मामले में मैं यह सुनिश्चित करने के लिए एक बाधा जोड़ता हूं कि समाप्ति तिथि प्रारंभ तिथि से पहले कभी नहीं हो सकती है। यह दो स्तंभों में डेटा की जाँच कर रहा है और इसलिए एक तालिका-स्तर की बाधा है।
अमान्य मान डालने का प्रयास करें:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 3, '2020-01-01', '1900-02-02' );
परिणाम:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkValidEndDate". The conflict occurred in database "Test", table "dbo.ConstraintTest".
ध्यान दें कि इस बाधा का परीक्षण करने के लिए, पिछली बाधा को पहले ट्रिगर होने से रोकने के लिए मुझे टीम के सदस्यों को बढ़ाकर 3 करना पड़ा (CHECK
बाधाओं को उनके बनाए जाने के क्रम में मान्य किया जाता है)।
उदाहरण 4 - एक जांच बाधा को बदलें
आप वास्तव में CHECK
. में बदलाव नहीं कर सकते बाधा अगर आपको इसे बदलने की ज़रूरत है, तो आपको इसे छोड़ना होगा और इसे नई परिभाषा के साथ बनाना होगा।
उदाहरण:
ALTER TABLE ConstraintTest DROP CONSTRAINT chkTeamSize; ALTER TABLE ConstraintTest ADD CONSTRAINT chkTeamSize CHECK (TeamSize >= 5 AND TeamSize <= 20) ;
जैसा कि बताया गया है, CHECK
बाधाओं को उनके बनाए जाने के क्रम में मान्य किया जाता है, इसलिए यह प्रभावित कर सकता है कि कौन सी त्रुटि पहले पकड़ी गई है।
इसलिए इस मामले में, यदि मैं एक अमान्य मान सम्मिलित करने का प्रयास करता हूं (और अमान्य तिथियां भी शामिल करता हूं), तो अमान्य तिथियां पहले पकड़ी जाएंगी:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 4, '2020-01-01', '1900-02-02' );
परिणाम:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkValidEndDate". The conflict occurred in database "Test", table "dbo.ConstraintTest".
इसलिए अपनी नवीनतम बाधा की जांच करने के लिए, मुझे पहले तारीख की समस्या को ठीक करना होगा:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 4, '2020-01-01', '2020-02-02' );
परिणाम:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkTeamSize". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'TeamSize'.
तो मेरी नवीनतम बाधा अपेक्षा के अनुरूप काम कर रही है।
उदाहरण 5 - बाधाओं और पहचान कॉलम की जांच करें
तो अब जब हमने बाधाओं का परीक्षण कर लिया है, तो चलिए आगे बढ़ते हैं और मान्य डेटा सम्मिलित करते हैं:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 5, '2020-01-01', '2020-02-02' );
परिणाम:
+--------------------+---------+------------+-------------+------------+ | ConstraintTestId | Price | TeamSize | StartDate | EndDate | |--------------------+---------+------------+-------------+------------| | 13 | 1.0000 | 5 | 2020-01-01 | 2020-02-02 | +--------------------+---------+------------+-------------+------------+
अंत में हमें एक सफल इंसर्ट मिलता है।
हालांकि, आप देखेंगे कि IDENTITY
कॉलम पहले ही बढ़कर 13 हो गया है।
याद रखें जब मैंने पहली बार तालिका बनाई थी तो मैंने ConstraintTestId
. को परिभाषित किया था IDENTITY(1,1)
. का उपयोग करने के लिए कॉलम , जिसका अर्थ है कि यह 1 से शुरू होना चाहिए और प्रत्येक पंक्ति डालने के साथ स्वचालित रूप से 1 से बढ़ जाना चाहिए।
लेकिन अब जब मैंने अपनी पहली पंक्ति को अंत में सम्मिलित कर लिया है, तो मान पहले से ही 13 है। ऐसा इसलिए है क्योंकि IDENTITY
CHECK
. होने पर भी कॉलम में वृद्धि होती है बाधा INSERT
. का कारण बनती है ऑपरेशन विफल होना।
ध्यान दें कि मैंने इस आलेख के उदाहरणों के साथ आने के दौरान कुछ अतिरिक्त असफल प्रविष्टियां की हैं, इसलिए यदि आप इस आलेख के साथ कदम से कदम मिलाकर पालन करते हैं तो मूल्य आपको जो मिलेगा उससे अधिक मूल्य तक बढ़ गया है।
किसी भी मामले में, आइए एक अंतिम असफल इंसर्ट करें, और फिर इसकी पुष्टि करने के लिए एक सफल इंसर्ट करें।
विफल इंसर्ट:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 2, 4, '2020-01-02', '2020-02-03' );
परिणाम:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkTeamSize". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'TeamSize'.
सफल इंसर्ट:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 2, 6, '2020-01-02', '2020-02-03' ); SELECT * FROM ConstraintTest;
परिणाम:
+--------------------+---------+------------+-------------+------------+ | ConstraintTestId | Price | TeamSize | StartDate | EndDate | |--------------------+---------+------------+-------------+------------| | 13 | 1.0000 | 5 | 2020-01-01 | 2020-02-02 | | 15 | 2.0000 | 6 | 2020-01-02 | 2020-02-03 | +--------------------+---------+------------+-------------+------------+
हम देख सकते हैं कि IDENTITY
कॉलम 13 से 15 तक कूदता है, इसलिए यह स्पष्ट रूप से विफल इंसर्ट के दौरान बढ़ा है।
जांच प्रतिबंधों के कुछ प्रतिबंध
CHECK
. के साथ काम करते समय ध्यान रखने योग्य कुछ प्रतिबंध यहां दिए गए हैं बाधाएं:
- खोज स्थिति का मूल्यांकन एक बूलियन व्यंजक से होना चाहिए और किसी अन्य तालिका का संदर्भ नहीं दे सकता।
- अभिव्यक्ति में उपनाम डेटा प्रकार नहीं हो सकते।
CHECK
बाधाओं को पाठ . पर परिभाषित नहीं किया जा सकता है , ntext , या छवि कॉलम।