2012-01-12 267 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