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

इनलाइन और आउट-ऑफ़-लाइन बाधाओं के बीच अंतर

तालिकाओं और स्तंभों पर प्रतिबंध आपको डेटा गुणवत्ता को लागू करने की अनुमति देते हैं। SQL में, किसी तालिका पर अवरोध उत्पन्न करने के दो तरीके हैं:इनलाइन और लाइन से बाहर

इस लेख में, मैं इन बाधाओं और उनके लाभों का पता लगाने जा रहा हूं, साथ ही यह भी बताऊंगा कि मैं किसकी सिफारिश करता हूं और क्यों।

एक इनलाइन बाधा क्या है?

एक इनलाइन बाधा एक बाधा है जिसे आप टेबल बनाते समय कॉलम के समान लाइन पर घोषित करते हैं।

CREATE TABLE employee (
emp_id NUMBER(10) PRIMARY KEY,
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10)
);

इस उदाहरण में, emp_id कॉलम के बाद PRIMARY KEY शब्द इंगित करते हैं कि emp_id प्राथमिक कुंजी है।

इस प्रकार, हमने कीवर्ड जोड़कर इस कॉलम पर प्राथमिक कुंजी बाधा बनाई है। बाधा प्रकार की परवाह किए बिना अवधारणा समान है।

एक आउट-ऑफ़-लाइन बाधा क्या है?

एक आउट-ऑफ-लाइन बाधा कॉलम के लिए एक अलग लाइन पर घोषित बाधा है। हम इसे CREATE TABLE स्टेटमेंट के अंत में जोड़ते हैं।

उदाहरण के लिए, हमारे पास निम्न स्क्रिप्ट है:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT pk_emp PRIMARY KEY (emp_id)
);

जैसा कि आप देख सकते हैं, हमने प्राथमिक कुंजी बाधा सेट की है, जिसे pk_emp कहा जाता है। , बयान के अंत में emp_id कॉलम में।

बाधा प्रकार की परवाह किए बिना यह अवधारणा उसी तरह काम करती है।

अब, इन दो प्रकार की बाधाओं के बीच अंतर का विश्लेषण करें, जहां उन्हें घोषित किया गया है।

आउट-ऑफ़-लाइन बाधाओं में निर्दिष्ट नाम हो सकते हैं

आउट-ऑफ़-लाइन बाधाएँ बनाते समय, हम एक नाम निर्दिष्ट कर सकते हैं। हालांकि यह समय की बर्बादी लग सकता है, यह मददगार हो सकता है।

इस पर एक विशेष उदाहरण पर विचार करें:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT pk_emp PRIMARY KEY (emp_id),
CONSTRAINT fk_emp_deptid FOREIGN KEY (dept_id) REFERENCES department (dept_id),
CONSTRAINT ck_emp_lnlen CHECK (LENGTH(last_name) > 3)
);

हमने कुछ बाधाओं के लिए निम्नलिखित नाम निर्दिष्ट किए हैं:

  • pk_emp
  • fk_emp_deptid
  • ck_emp_lnlen

ऐसा लग सकता है कि यह सिर्फ अनावश्यक टाइपिंग है, लेकिन ऐसा नहीं है। हम इस पर करीब से नज़र डालेंगे।

तो, हमें एक बाधा के लिए एक नाम निर्दिष्ट करने की आवश्यकता क्यों है?

बाधाओं का नाम रखने से कई स्थितियों में मदद मिल सकती है। नाम निर्दिष्ट किए बिना, Oracle स्वचालित रूप से उस बाधा के लिए एक नाम उत्पन्न करता है जो वह सभी इनलाइन बाधाओं के लिए करता है। आमतौर पर, यह नाम कोई उपयोगी जानकारी प्रदान नहीं करता है।

जब आपको SQL कथनों, PL/SQL कोड, या एप्लिकेशन कोड में त्रुटियां मिलती हैं, तो बाधा नाम का उपयोग करना और यह जानना एक अच्छा विचार है कि यह क्या संदर्भित करता है या कम से कम अनुमान लगाएं। pk_emp . जैसे नाम या ck_emp_lnlen सामान्य EMP1290894FH . की तुलना में अधिक वर्णनात्मक होगा नाम।

साथ ही, निष्पादन योजनाओं की समीक्षा करते समय, आउटपुट में अक्सर बाधा नाम का उपयोग किया जाता है, जिससे यह पता लगाना आसान हो जाता है कि योजना को कैसे क्रियान्वित किया जा रहा है। विशेष रूप से, जब हमारे पास यह निर्धारित करने वाले मामले हों कि प्राथमिक कुंजी या विदेशी कुंजी का उपयोग किया जा रहा है या नहीं।

न कि पूर्ण बाधाओं को केवल इनलाइन घोषित किया जा सकता है

केवल एक बाधा प्रकार है जिसे इनलाइन बाधा के रूप में घोषित किया जा सकता है। यह पूरी तरह से बाधा नहीं है।

इसका मतलब है कि आप इसे आउट ऑफ लाइन घोषित नहीं कर सकते।

निम्नलिखित कोड निष्पादित करें:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200) NOT NULL,
dept_id NUMBER(10)
);

हालांकि, नीचे दिए गए कोड को चलाते समय, हम देख सकते हैं कि यह काम नहीं करता है:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT nn_emp_ln NOT NULL (last_name)
);

संक्षेप में, NOT NULL बाधाओं के लिए, हमें उन्हें इनलाइन घोषित करना होगा।

चेक बाधाएं एकाधिक कॉलम का संदर्भ दे सकती हैं

यदि आप एक CHECK इनलाइन बाधा बनाते हैं, तो यह केवल उस कॉलम को संदर्भित कर सकता है जिस पर इसे बनाया जा रहा है।

हालाँकि, यदि आप लाइन से बाहर के रूप में एक CHECK बाधा बनाते हैं, तो यह कई स्तंभों को संदर्भित कर सकता है।

कर्मचारी बनाएं CHECK बाधा के साथ तालिका जैसा कि नीचे दिखाया गया है:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200) CHECK (LENGTH(first_name) > 10),
last_name VARCHAR2(200),
dept_id NUMBER(10)
);

यह बाधा दर्शाती है कि first_name 10 वर्णों से अधिक लंबा होना चाहिए।

हालांकि, क्या होगा यदि हम यह निर्दिष्ट करना चाहते हैं कि संयोजन प्रथम नाम और उपनाम का 10 वर्णों से अधिक होना चाहिए?

ऐसा करने के लिए, कोड को एक आउट-ऑफ़-लाइन बाधा के रूप में फिर से लिखें:

CREATE TABLE employee (
emp_id NUMBER(10),
first_name VARCHAR2(200),,
last_name VARCHAR2(200),
dept_id NUMBER(10),
CONSTRAINT ck_fullname_len CHECK (LENGTH(first_name || last_name) > 10)
);

हम देख सकते हैं कि यह नियम केवल एक आउट-ऑफ़-लाइन बाधा के साथ ही लागू किया जा सकता है।

अनुशंसित विधि

दोनों विधियों का विश्लेषण करने के बाद:इनलाइन या आउट ऑफ लाइन, मैं आउट-ऑफ-लाइन बाधाओं का उपयोग करने की सलाह देता हूं।

इसके कुछ कारण हैं।

सबसे पहले, आप अपनी बाधाओं के लिए एक नाम निर्दिष्ट कर सकते हैं और उन्हें त्रुटि संदेशों और आंतरिक निष्पादन योजनाओं में देख सकते हैं। यह बाधाओं को अक्षम और सक्षम करने में भी मदद कर सकता है।

दूसरे, चेक बाधाएं आपको एकाधिक और एकल कॉलमों को संदर्भित करने की अनुमति देती हैं। इस प्रकार, यदि आप उन्हें एक आउट-ऑफ़-लाइन बाधा के रूप में जोड़ते हैं तो यह अधिक लचीला होता है।

अंत में, सभी बाधाओं को लाइन से बाहर घोषित कर दिया गया है (नॉट न्यूल को छोड़कर जिसे केवल इनलाइन बाधा के रूप में परिभाषित किया जा सकता है) आपके CREATE TABLE सिंटैक्स को देखना और अपनी सभी बाधाओं को एक ही स्थान पर देखना आसान बनाता है। यह विशेष रूप से उन मामलों में महत्वपूर्ण है जब कई बाधाओं के साथ बड़ी तालिकाएँ होती हैं।

अंत में, आप दो अलग-अलग तरीकों का उपयोग करके बाधाएँ बना सकते हैं:इनलाइन और आउट ऑफ़ लाइन। जहां आप कर सकते हैं, मैं आउट-ऑफ-लाइन पद्धति का उपयोग करने की सलाह देता हूं, क्योंकि इसमें अधिक लचीलापन है, और बाधाओं के लिए एक नाम सेट करना, इस प्रकार, आपकी निष्पादन योजनाओं और अन्य SQL जानकारी के विश्लेषण को सरल बनाना है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टेम्पोरल टेबल का उपयोग करके डेटा परिवर्तन ऑडिट करना

  2. यदि आप अनुक्रमित दृश्यों और MERGE का उपयोग कर रहे हैं, तो कृपया इसे पढ़ें!

  3. आईओएस के लिए क्लाउड फायरस्टोर के साथ शुरुआत करना

  4. क्रिस्टल रिपोर्ट्स से सेल्सफोर्स SOQL

  5. PowerShell को Salesforce.com से कनेक्ट करना