जब मैं बाधा का नाम नहीं जानता, तो मैं ओरेकल में एक "शून्य नहीं" बाधा कैसे गिरा सकता हूं?


85

मेरे पास एक डेटाबेस है जिसमें एक क्षेत्र पर एक पूर्ण नाल बाधा नहीं है, और मैं इस बाधा को दूर करना चाहता हूं। जटिल कारक यह है कि इस बाधा का एक सिस्टम-परिभाषित नाम है, और उस बाधा का नाम उत्पादन सर्वर, एकीकरण सर्वर और विभिन्न डेवलपर डेटाबेस के बीच भिन्न होता है। हमारी वर्तमान प्रक्रिया स्क्रिप्ट बदलने की जाँच करने के लिए है, और एक स्वचालित कार्य लक्ष्य डेटाबेस के खिलाफ sqlplus के माध्यम से उचित प्रश्नों को निष्पादित करता है, इसलिए मैं एक समाधान पसंद करूँगा जिसे सीधे sqlplus में भेजा जा सके।

अपने स्वयं के डेटाबेस पर, एसक्यूएल इसे छोड़ने के लिए होगा:

alter table MYTABLE drop constraint SYS_C0044566

जब मैं all_constraintsदृश्य को क्वेरी करता हूं तो मैं बाधा देख सकता हूं :

select * from all_constraints where table_name = 'MYTABLE'

लेकिन मुझे यकीन है कि कैसे साथ काम करने के लिए नहीं कर रहा हूँ SEARCH_CONDITIONके LONGडेटा प्रकार या सबसे अच्छा कैसे गतिशील रूप से देखा-अप बाधा मैं अपने नाम पता होने के बाद भी नष्ट करने के लिए।

तो, मैं एक परिवर्तन स्क्रिप्ट कैसे बना सकता हूं जो इस बाधा को गिरा सकती है कि यह क्या है, इसके बजाय इसका नाम क्या है?


संपादित करें: @ एलन का उत्तर एक अच्छा है, लेकिन मैं चिंतित हूं (ओरेकल विशेषज्ञता की मेरी कमी में) कि यह सार्वभौमिक रूप से सच नहीं हो सकता है कि किसी भी बाधा जिसका सिस्टम-जनित नाम हो सकता है, उसके साथ जुड़ा होगा जो इसे हटाने का एक तरीका होगा इसके नाम को जाने बिना बाधा। क्या यह सच है कि तार्किक रूप से उस बाधा को दूर करने के लिए एक सिस्टम-नाम वाले बाधा का नाम जानने से बचने का एक तरीका हमेशा रहेगा?


3
बस अपनी जिज्ञासा को संतुष्ट करने के लिए: नॉट नाल बाधा केवल ओरेकल में एकमात्र बाधा प्रकार है जिसे आप बिना बाधा के नाम जानने के लिए हटा सकते हैं। अन्य सभी बाधाओं को आपको बाधा के नाम से जानना होगा।
जेफरी केम्प

जवाबों:


166
alter table MYTABLE modify (MYCOLUMN null);

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

संशोधित प्रश्न को स्पष्ट करना : यह समाधान केवल "शून्य नहीं" कॉलम के लिए बनाई गई बाधाओं पर लागू होता है। यदि आप "प्राथमिक कुंजी" या स्तंभ नाम में एक चेक बाधा निर्दिष्ट करते हैं, तो इसका नामकरण किए बिना, आप बाधा (और प्राथमिक कुंजी के लिए सूचकांक) के लिए एक सिस्टम-जनित नाम के साथ समाप्त करेंगे। उन मामलों में, आपको इसे छोड़ने के लिए नाम जानना होगा। सबसे अच्छी सलाह यह है कि परिदृश्य से बचने के लिए सुनिश्चित करें कि आप "शून्य नहीं" के अलावा सभी बाधाओं के लिए एक नाम निर्दिष्ट करें। यदि आप स्वयं को उस स्थिति में पाते हैं जहाँ आपको इनमें से किसी एक बाधा को उदारतापूर्वक छोड़ने की आवश्यकता है, तो आपको संभवतः PL / SQL और डेटा-परिभाषा तालिकाओं का सहारा लेना होगा।


यह सच होने के लिए बहुत अच्छा लगता है, लेकिन यह निश्चित रूप से मेरे वर्तमान मामले को संभालता है और स्पष्ट रूप से सरल है! क्या ओरेकल में ऐसे कोई मामले हैं, जहां बाधा नाम सिस्टम-जनरेट किया जा सकता है, लेकिन इस तरह से बाधा नाम से बचने के लिए sql नहीं लिखा जा सकता है?
क्रिस किसान

1
धन्यवाद ... यह पता चला है कि not nullबाधाएं मेरे स्कीमा में केवल सिस्टम-नामित वाले हैं जो मुझे इस तरह से कभी भी प्रभावित करने की संभावना रखते हैं।
क्रिस किसान


1

बस याद रखें, यदि आप जिस क्षेत्र को अशक्त बनाना चाहते हैं, वह प्राथमिक कुंजी का हिस्सा है, तो आप नहीं कर सकते। प्राथमिक कुंजी में शून्य फ़ील्ड नहीं हो सकते।


1

उपयोग की गई किसी भी बाधा को खोजने के लिए, नीचे दिए गए कोड का उपयोग करें:

-- Set the long data type for display purposes to 500000.

SET LONG 500000

-- Define a session scope variable.

VARIABLE output CLOB

-- Query the table definition through the <code>DBMS_METADATA</code> package.

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual;

यह अनिवार्य रूप से संदर्भित तालिका कैसे बनाई जाती है, इसके लिए एक विवरण दिखाती है। यह जानकर कि तालिका कैसे बनाई जाती है, आप तालिका की सभी बाधाओं को देख सकते हैं।

माइकल मैकलॉघलिन के ब्लॉग से लिया गया उत्तर: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ अपने डेटाबेस डिज़ाइन I वर्ग से।


0

मैं एक ही समस्या का सामना कर रहा था कि एक कस्टम चेक बाधा के चारों ओर जाने की कोशिश कर रहा था जिसे मुझे विभिन्न मूल्यों की अनुमति देने के लिए अद्यतन करने की आवश्यकता थी। समस्या यह है कि ALL_CONSTRAINTS के पास यह बताने का कोई तरीका नहीं है कि कौन-से कॉलम को लागू किया गया है। जिस तरह से मैं ऐसा करने में कामयाब रहा, उसके बजाय ALL_CONS_COLUMNS को क्वेरी करके, फिर प्रत्येक बाधा को उनके नाम से हटाकर इसे फिर से बनाया।

all_cons_columns से constraint_name चुनें जहाँ table_name = [TABLE_NAME] और column_name = [COLUMN_NAME];


0

मेरे साथ कुछ ऐसा हुआ जब मैंने अस्थायी तालिकाओं में संरचनाओं की प्रतियां बनाईं, इसलिए मैंने अशक्त नहीं हटाया।

DECLARE
   CURSOR cur_temp_not_null IS
        SELECT table_name, constraint_name  FROM all_constraints WHERE table_name LIKE 'TEMP_%' AND  owner='myUSUARIO';

   V_sql VARCHAR2(200); 

BEGIN
  FOR c_not_null IN cur_temp_not_null
   LOOP
     v_sql :='ALTER TABLE ' || c_not_null.table_name || ' DROP CONSTRAINT '|| c_not_null.constraint_name;
     EXECUTE IMMEDIATE  v_sql;     
  END LOOP;
END;

स्टैक ओवरफ्लो एक अंग्रेजी केवल साइट है। हालांकि, स्टैक ओवरफ्लो एन एस्पनॉल है । मेरा संपादन देखें।
help-info.de

0

यदि स्तंभ बनाने में बाधा एक तालिका बनाने के दौरान एक नाम के बिना बनाई गई थी, तो ओरेकल इसके लिए एक यादृच्छिक नाम निर्दिष्ट करेगा। दुर्भाग्य से, हम बाधा को सीधे संशोधित नहीं कर सकते।

स्तंभ से जुड़े अनाम अवरोध को छोड़ने के चरण शामिल हैं

  1. STATUS फ़ील्ड को एक नए फ़ील्ड STATUS2 में डुप्लिकेट करें
  2. STATUS2 पर CHECK बाधाओं को परिभाषित करें
  3. डेटा को STATUS से STATUS2 में माइग्रेट करें
  4. ड्रॉप STATUS कॉलम
  5. STATUS2 को STATUS का नाम दें

    ALTER TABLE MY_TABLE ADD STATUS2 NVARCHAR2(10) DEFAULT 'OPEN'; ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_CHECK_STATUS CHECK (STATUS2 IN ('OPEN', 'CLOSED')); UPDATE MY_TABLE SET STATUS2 = STATUS; ALTER TABLE MY_TABLE DROP COLUMN STATUS; ALTER TABLE MY_TABLE RENAME COLUMN STATUS2 TO STATUS;

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