2012-01-12 268 views
7

所有如何在ORACLE中創建表時限制INTEGER的長度?

當創建在Oracle SQL *表加,我希望限制一個INTEGER列的長度可以只能是8

例如:RegNumber是一個INTEGER,它必須是一個8位數字。

我在創建表格時如何做到這一點?

+2

你想00000001存儲爲00000001或1,例如不管這個8位數字是固定的長度嗎? – Andrew 2012-01-12 15:45:43

+0

爲了保持完整性,在你的情況下是否可接受的八位數字是-12345678? – pilcrow 2012-01-12 21:20:05

+0

是的,我想000000001被存儲爲00000001,不是1,因爲我想要一個8位數字,正好8! – MengT 2012-01-13 11:21:54

回答

9

INTEGER數據類型只是NUMBER的子類型。您可以將該列定義爲NUMBER(8,0),以獲得一個整數列,即< = 8位數。

如果你想以確保列是8位,只有8位,則需要對列增加一個檢查約束:

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

+1,但是,爲什麼使用NUMBER類型而不是INT?您可以具有> 9999999 AND <100000000 ... – MatBailie 2012-01-12 15:52:24

+0

INT/INTEGER只是Oracle中NUMBER的子類型,定義爲NUMBER(38,0)。由於oracle在後端的變長字段中存儲數字,因此存儲/性能相同。它*可能會稍微提高速度,只有一個檢查約束而不是兩個,但我沒有測試過。 – 2012-01-12 16:06:34

+0

@Dems,你的方法很好,但是我只能插入10000000到99999999的值(不包括00000000 - 09999999),它們都是8位數字,但是有什麼方法可以把00000001也是有效的8位數字? – MengT 2012-01-13 11:30:23

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> 

精度要強制執行的確切長度(所有的數字必須是八位長),你需要使用CHECK約束:

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:在oracle中,LENGTH()接受一個字符串。這意味着你正在使用一個固定點類型來表示一個INT,然後隱式地將它轉換爲一個字符串來檢查它的長度。它的工作,但*,* *;) – MatBailie 2012-01-12 15:55:06

+1

@Dems - 不知道你爲什麼要去「yikes」。我已經運行了一次插入一萬行的掛鐘測試,並且我指定的檢查約束使*與經過的時間沒有明顯的差別。 – APC 2012-01-12 16:57:03

+1

真的嗎?這不是我所期望的。然而,正如你所測試的那樣,正如你所說,沒有*明顯的差異,我會說這是一個不錯的答案,然後...... +1 – MatBailie 2012-01-12 17:07:52