當創建在Oracle SQL *表加,我希望限制一個INTEGER列的長度可以只能是8。
例如:RegNumber是一個INTEGER,它必須是一個8位數字。
我在創建表格時如何做到這一點?
當創建在Oracle SQL *表加,我希望限制一個INTEGER列的長度可以只能是8。
例如:RegNumber是一個INTEGER,它必須是一個8位數字。
我在創建表格時如何做到這一點?
INTEGER數據類型只是NUMBER的子類型。您可以將該列定義爲NUMBER(8,0),以獲得一個整數列,即< = 8位數。
如果你想以確保列是8位,只有8位,則需要對列增加一個檢查約束:
CREATE TABLE RegTable
(RegNumber NUMBER(8,0),
CONSTRAINT CheckRegNumber CHECK (RegNumber > 9999999)
);
+1,但是,爲什麼使用NUMBER類型而不是INT?您可以具有> 9999999 AND <100000000 ... – MatBailie 2012-01-12 15:52:24
INT/INTEGER只是Oracle中NUMBER的子類型,定義爲NUMBER(38,0)。由於oracle在後端的變長字段中存儲數字,因此存儲/性能相同。它*可能會稍微提高速度,只有一個檢查約束而不是兩個,但我沒有測試過。 – 2012-01-12 16:06:34
@Dems,你的方法很好,但是我只能插入10000000到99999999的值(不包括00000000 - 09999999),它們都是8位數字,但是有什麼方法可以把00000001也是有效的8位數字? – MengT 2012-01-13 11:30:23
只要指定長度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>
+0:在oracle中,LENGTH()接受一個字符串。這意味着你正在使用一個固定點類型來表示一個INT,然後隱式地將它轉換爲一個字符串來檢查它的長度。它的工作,但*,* *;) – MatBailie 2012-01-12 15:55:06
@Dems - 不知道你爲什麼要去「yikes」。我已經運行了一次插入一萬行的掛鐘測試,並且我指定的檢查約束使*與經過的時間沒有明顯的差別。 – APC 2012-01-12 16:57:03
真的嗎?這不是我所期望的。然而,正如你所測試的那樣,正如你所說,沒有*明顯的差異,我會說這是一個不錯的答案,然後...... +1 – MatBailie 2012-01-12 17:07:52
你想00000001存儲爲00000001或1,例如不管這個8位數字是固定的長度嗎? – Andrew 2012-01-12 15:45:43
爲了保持完整性,在你的情況下是否可接受的八位數字是-12345678? – pilcrow 2012-01-12 21:20:05
是的,我想000000001被存儲爲00000001,不是1,因爲我想要一個8位數字,正好8! – MengT 2012-01-13 11:21:54