Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में एक जाँच बाधा कैसे बनाएँ (T-SQL उदाहरण)

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 , या छवि कॉलम।

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. यदि एक ही कथन में दो बार उपयोग किया जाता है तो क्या GETUTCDATE() वही मान लौटाएगा?

  2. कोडइग्निटर एमएसएसक्यूएल कनेक्शन

  3. SQL पैरामीटर में स्ट्रिंग ऐरे को SQL में IN क्लॉज़ में कैसे पास करें?

  4. नोड js . में mssql क्वेरी के लिए पैरामीटर कैसे पास करें

  5. .NET/SQL सर्वर में कनेक्शन पूलिंग?