जब आप किसी स्तंभ की लंबाई को संशोधित (कम) करते हैं तो क्या होता है?


10

आइए कहते हैं कि मेरे पास दो प्रकार के कॉलम हैं NUMBER(बिना सटीक और पैमाने के) और VARCHAR(300)। मैंने देखा कि ये कॉलम मेरे डेटा के लिए बहुत बड़े हैं, इसलिए मैं उन्हें संशोधित करना चाहता हूं NUMBER(11)और VARCHAR(10)। इसलिए यदि मैं यह SQL कथन चलाता हूं:

ALTER TABLE FOO
    MODIFY(BAR NUMBER(10));
  • क्या मैं गैर-रिक्त कॉलम में ऐसा कर पाऊंगा?
  • यदि हां, तो क्या होगा यदि एक से अधिक मूल्य है NUMBER(10), क्या ओरेकल मुझे इसके बारे में बताएगा?
  • क्या पहले से परिभाषित होने पर कॉलम डिफ़ॉल्ट मान अपरिवर्तित रहेंगे?
  • क्या कॉलम अशक्त विकल्प अपरिवर्तित रहेगा?
  • क्या उस स्तंभ पर प्राथमिक, विदेशी, अद्वितीय कुंजी अपरिवर्तित रहेगी?
  • क्या उस कॉलम में शामिल बाधाएं अपरिवर्तित रहेंगी?
  • क्या उस कॉलम पर अनुक्रमणित अपरिवर्तित रहेंगे?

क्या कोई आधिकारिक दस्तावेज मेरे सवालों का जवाब दे रहा है?

जवाबों:


12

ओरेकल प्रशासक गाइड निम्नलिखित कहते हैं:

किसी मौजूदा स्तंभ परिभाषा को संशोधित करने के लिए ALTER TABLE ... MODIFY स्टेटमेंट का उपयोग करें। आप स्तंभ डेटा प्रकार, डिफ़ॉल्ट मान, स्तंभ बाधा, स्तंभ अभिव्यक्ति (वर्चुअल कॉलम के लिए) और स्तंभ एन्क्रिप्शन को संशोधित कर सकते हैं।

आप किसी मौजूदा कॉलम की लंबाई बढ़ा सकते हैं, या घटा सकते हैं, यदि सभी मौजूदा डेटा नई लंबाई को संतुष्ट करते हैं। आप बाइट शब्दार्थ से एक स्तंभ को CHAR शब्दार्थ या इसके विपरीत में बदल सकते हैं। गैर-खाली CHAR कॉलम की लंबाई कम करने के लिए आपको आरंभिक पैरामीटर BLANK_TRIMMING = TRUE सेट करना होगा।

यदि आप डेटा प्रकार CHAR के एक कॉलम की लंबाई बढ़ाने के लिए एक तालिका को संशोधित कर रहे हैं, तो महसूस करें कि यह समय लेने वाला ऑपरेशन हो सकता है और इसके लिए पर्याप्त अतिरिक्त भंडारण की आवश्यकता हो सकती है, खासकर यदि तालिका में कई पंक्तियाँ हों। ऐसा इसलिए है क्योंकि नई पंक्ति लंबाई को संतुष्ट करने के लिए प्रत्येक पंक्ति में CHAR मान रिक्त-गद्देदार होना चाहिए।

Oracle SQL भाषा संदर्भ निम्नलिखित सहित और अधिक विस्तार से दिया गया है:

यदि स्तंभ की सभी पंक्तियों में नल हैं, तो आप किसी भी स्तंभ का डेटा प्रकार बदल सकते हैं। हालाँकि, यदि आप किसी भौतिक दृश्य कंटेनर तालिका में स्तंभ का डेटा प्रकार बदलते हैं, तो Oracle डेटाबेस संबंधित भौतिक दृश्य को अमान्य कर देता है।

आप हमेशा किसी वर्ण या कच्चे स्तंभ का आकार या किसी संख्यात्मक स्तंभ की शुद्धता बढ़ा सकते हैं, चाहे सभी पंक्तियों में नल हों या न हों। आप एक डेटा प्रकार के स्तंभ के आकार को तब तक कम कर सकते हैं जब तक कि परिवर्तन के लिए डेटा को संशोधित करने की आवश्यकता न हो। डेटाबेस मौजूदा डेटा को स्कैन करता है और यदि डेटा मौजूद है तो नई लंबाई सीमा से अधिक होने पर एक त्रुटि देता है।

आप DATE कॉलम को TIMESTAMP या TIMESTAMP को LOCAL TIME ZONE के साथ संशोधित कर सकते हैं। आप किसी भी TIMESTAMP को LATEAL TIME ZONE के साथ DATE कॉलम में संशोधित कर सकते हैं।

यदि तालिका खाली है, तो आप अग्रणी फ़ील्ड या किसी डेटाटाइम या अंतराल स्तंभ के आंशिक द्वितीय मान को बढ़ा या घटा सकते हैं। यदि तालिका खाली नहीं है, तो आप केवल एक प्रमुख क्षेत्र या अंशकालिक सेकंड को डेटाइम या अंतराल कॉलम बढ़ा सकते हैं।

CHAR और VARCHAR2 स्तंभों के लिए, आप CHAR निर्दिष्ट करके लंबाई शब्दार्थ को बदल सकते हैं (मूल रूप से बाइट्स में निर्दिष्ट कॉलम के लिए वर्ण शब्दार्थ को इंगित करने के लिए) या BYTE (मूल रूप से वर्णों में निर्दिष्ट स्तंभ के लिए बाइट शब्दार्थ को इंगित करने के लिए)। मौजूदा स्तंभों की लंबाई शब्दार्थ जानने के लिए, ALL_, USER_, या DBA_TAB_COLUMNS डेटा शब्दकोश दृश्य के CHAR_USED कॉलम को क्वेरी करें।

उपरोक्त दस्तावेज में अतिरिक्त जानकारी और प्रतिबंध हैं। यहां संख्या स्तंभ की सटीकता को कम करने और Varchar2 की लंबाई को कम करने के प्रयास का प्रदर्शन है। आप अन्य परिवर्तनों की कोशिश कर सकते हैं ताकि आप जान सकें कि क्या होगा।

--Setup.
DROP TABLE FOO;
CREATE TABLE FOO (BAR Number, BAR2 VARCHAR2(300));
INSERT INTO FOO (SELECT Level, RPAD(to_char(Level),10*Level,to_char(Level)) 
   FROM DUAL CONNECT BY Level <=20);
COMMIT;
SELECT * FROM FOO;

--Reduce Number to Number(10).
ALTER TABLE FOO MODIFY (BAR NUMBER (10));

--Reduce Varchar2(300) to Varchar2(100) (data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100));

--Reduce Varchar2(300) to Varchar2(200) (no data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(200));

परिवर्तन विवरण में निम्न आउटपुट होते हैं:

ALTER TABLE FOO MODIFY (BAR NUMBER (10))
Error report:
SQL Error: ORA-01440: column to be modified must be empty to decrease precision or scale
01440. 00000 -  "column to be modified must be empty to decrease precision or scale"

ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100))
Error report:
SQL Error: ORA-01441: cannot decrease column length because some value is too big
01441. 00000 -  "cannot decrease column length because some value is too big"

table FOO altered.

एक नया कॉलम बनाकर सटीक कम करें।

ALTER TABLE FOO ADD (BAR3 NUMBER(10));
UPDATE FOO SET Bar3 = Bar;
ALTER TABLE FOO DROP COLUMN BAR;
ALTER TABLE FOO RENAME COLUMN BAR3 TO BAR;

तो, निष्कर्ष यह है - यदि आप कॉलम के सटीक या स्केल को कम करना चाहते हैं और अनुक्रमित, चाबियाँ आदि जैसी चीजों को रखना चाहते हैं, तो इसका एक ही तरीका है कि टेबल की नकल करें, इसे काटें, प्रकार बदलें, डेटा को वापस कॉपी करें और ड्रॉप करें अस्थायी तालिका। कोई तेज, अधिक सुरुचिपूर्ण तरीका नहीं है?
मोंटोटका

1
ठीक है, आप एक नया कॉलम बना सकते हैं, डेटा कॉपी कर सकते हैं, इंडेक्स बना सकते हैं, पुराने कॉलम को छोड़ सकते हैं और नया नाम बदल सकते हैं। आप DBMS_REDEFINITION का उपयोग भी कर सकते हैं, या आप एक नई तालिका बना सकते हैं, डेटा की प्रतिलिपि बना सकते हैं, पुरानी तालिका को छोड़ सकते हैं और नया नाम बदल सकते हैं। या आप तालिका को निर्यात कर सकते हैं, इसे छोड़ सकते हैं, इसे नई परिभाषा के साथ फिर से बना सकते हैं और वे डेटा आयात कर सकते हैं। ऐसा करने के बहुत सारे तरीके हैं, लेकिन तेज / अधिक सुरुचिपूर्ण कुछ ऐसा है जिसे आपको तय करना होगा।
लेह रिफ़ेल

संभवतः आप एक नया कॉलम भी बना सकते हैं, उस पर डेटा कॉपी कर सकते हैं, पुराने कॉलम को शून्य पर सेट कर सकते हैं, उसकी लंबाई को संशोधित कर सकते हैं, नए कॉलम से डेटा को पुराने पुराने कॉलम में कॉपी कर सकते हैं और नए कॉलम को ड्रॉप कर सकते हैं। और क्योंकि डेटा फिट होगा भले ही सभी संख्यात्मक अंक को कम करने की अनुमति नहीं देता है। 8- {
हंस-पीटर स्टॉर्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.