2012-01-12 7 views
7

सभीORACLE में कोई तालिका बनाते समय INTEGER की लंबाई को कैसे प्रतिबंधित करें?

जब में ओरेकल एसक्यूएल * एक मेज बनाने के साथ साथ, मैं प्रतिबंधित करने के लिए कि एक पूर्णांक स्तंभ की लंबाई केवल 8 हो सकता है चाहता हूँ।

उदाहरण: RegNumber एक इंटेग्रर है, और यह 8 अंकों का नंबर होना चाहिए।

मैं टेबल बनाते समय यह कैसे कर सकता हूं?

+2

आप चाहते हैं 00000001 00000001 या के रूप में संग्रहीत करने के लिए करते हैं 1, उदाहरण के लिए क्या यह 8 अंक संख्या निश्चित लंबाई है? – Andrew

+0

पूर्णता के लिए, -12345678 आपके मामले में एक स्वीकार्य आठ अंक संख्या है? – pilcrow

+0

हां, मैं 000000001 00000001 के रूप में संग्रहीत करना चाहता हूं, नहीं 1, क्योंकि मुझे 8 अंकों की संख्या चाहिए, बिल्कुल 8! – MengT

उत्तर

9

INTEGER डेटाटाइप केवल NUMBER का उप-प्रकार है। < = 8 अंकों के लिए आप एक पूर्णांक कॉलम प्राप्त करने के लिए कॉलम को NUMBER (8,0) के रूप में परिभाषित कर सकते हैं।

आप यह सुनिश्चित करें कि स्तंभ 8 अंक और केवल 8 अंक है कोशिश कर रहे हैं, तो आप स्तंभ पर एक चेक बाधा जोड़ने की आवश्यकता होगी:

CREATE TABLE RegTable 
(RegNumber NUMBER(8,0), 
CONSTRAINT CheckRegNumber CHECK (RegNumber > 9999999) 
); 
+0

+1, लेकिन, NUMBER प्रकार का उपयोग क्यों करें और एक आईएनटी क्यों नहीं? आपके पास> 99 99 999 और <100000000 ... – MatBailie

+0

INT/INTEGER ओरेकल में केवल NUMBER का उप-प्रकार है जिसे NUMBER (38,0) के रूप में परिभाषित किया गया है। बैक एंड पर वेरिएबल-लम्बाई फ़ील्ड में ओरेकल स्टोर नंबरों के बाद स्टोरेज/प्रदर्शन समान है। यह * थोड़ा सा सुधार हो सकता है केवल दो की बजाय एक जांच बाधा है, लेकिन मैंने इसका परीक्षण नहीं किया है। –

+0

@ डेम्स, आपकी विधि अच्छी है, लेकिन मैं केवल 10000000 से 99 99 99 99 (00000000 - 09 99 99 99 शामिल नहीं) से मूल्यों को सम्मिलित कर सकता हूं, वे सभी 8 अंकों की संख्या हैं, लेकिन क्या कोई संभावित तरीका है जो 00000001 को मान्य 8 अंकों का नंबर भी मानती है? – MengT

2

बस (सभी नंबरों को आठ अंकों का होना चाहिए) यदि आप एक जांच बाधा का उपयोग करना होगा एक सटीक लंबाई को लागू करने के लिए 8 की लंबाई और 0. की परिशुद्धता इस

SQL> create table t8 (col1 number(8,0)) 
    2/

Table created. 

SQL> insert into t8 values (12345678) 
    2/

1 row created. 

SQL> insert into t8 values (123456789) 
    2/
insert into t8 values (123456789) 
         * 
ERROR at line 1: 
ORA-01438: value larger than specified precision allowed for this column 


SQL> 

की तरह निर्दिष्ट करें:

SQL> alter table t8 
    2 add constraint t8_ck check (length(col1) = 8) 
    3/

Table altered. 

SQL> insert into t8 values (1234567) 
    2/
insert into t8 values (1234567) 
* 
ERROR at line 1: 
ORA-02290: check constraint (APC.T8_CK) violated 


SQL> 
+3

+0: ऑरैकल में, LENGTH() एक स्ट्रिंग लेता है। इसका मतलब यह है कि आप एक आईएनटी का प्रतिनिधित्व करने के लिए एक निश्चित बिंदु प्रकार का उपयोग कर रहे हैं, फिर इसकी लंबाई की जांच करने के लिए इसे एक स्ट्रिंग पर निहित रूप से कास्टिंग करें। यह काम करता है, लेकिन, * yikes *;) – MatBailie

+1

@Dems - सुनिश्चित नहीं है कि आप "yikes" क्यों जाते हैं। मैंने एक समय में दस हजार पंक्तियों को डालने वाले कुछ दीवार-घड़ी परीक्षण चलाए हैं और जैसा कि मैंने निर्दिष्ट किया है, चेक बाधा * बीतने वाले समय में * कोई सराहनीय अंतर नहीं बनाता है। – APC

+1

वास्तव में? यही वह नहीं है जो मैंने अपेक्षित था। हालांकि, आपने इसका परीक्षण किया है और, जैसा कि आप कहते हैं, कोई * सराहनीय * अंतर नहीं है, मैं कहूंगा कि यह एक सभ्य उत्तर है ... +1 – MatBailie

संबंधित मुद्दे