2012-01-12 28 views
7

tất cảLàm cách nào để hạn chế độ dài INTEGER khi tạo bảng trong ORACLE?

Khi tạo bảng trong Oracle sql * plus, tôi muốn giới hạn độ dài của cột INTEGER có thể chỉ là 8.

ví dụ: RegNumber là INTEGER và phải là số có 8 chữ số.

Tôi làm cách nào để tạo bảng?

+2

nào bạn muốn 00000001 để được lưu trữ như 00000001 hoặc 1, ví dụ số 8 chữ số này có phải là chiều dài cố định không? – Andrew

+0

Để hoàn thành, có -12345678 một số có thể chấp nhận được gồm 8 chữ số trong trường hợp của bạn không? – pilcrow

+0

có, tôi muốn 000000001 được lưu trữ là 00000001, KHÔNG 1, vì tôi muốn có số có 8 chữ số, chính xác là 8! – MengT

Trả lời

9

Kiểu dữ liệu INTEGER chỉ là một loại phụ của NUMBER. Bạn có thể xác định cột là NUMBER (8,0) để có được cột số nguyên là < = 8 chữ số.

Nếu bạn đang cố gắng để đảm bảo rằng các cột là 8 chữ số và chỉ 8 chữ số, bạn sẽ cần phải thêm một hạn chế kiểm tra trên cột:

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

+1, Nhưng, tại sao lại sử dụng một loại NUMBER chứ không phải INT? Bạn có thể có> 9999999 VÀ <100000000 ... – MatBailie

+0

INT/INTEGER chỉ là một loại phụ của NUMBER trong Oracle được định nghĩa là NUMBER (38,0). Lưu trữ/hiệu suất là như nhau kể từ khi lưu trữ các số trong các trường có độ dài thay đổi ở phía sau. Nó * có thể * là một cải tiến tốc độ nhỏ chỉ có một ràng buộc kiểm tra thay vì hai, nhưng tôi đã không kiểm tra điều đó. –

+0

@ Dường, phương pháp của bạn tốt, nhưng tôi chỉ có thể chèn giá trị từ 10000000 đến 99999999 (không bao gồm 00000000 - 09999999), tất cả đều là 8 chữ số, nhưng có phương pháp nào có thể coi 00000001 cũng là số có 8 chữ số hợp lệ không? – MengT

2

Chỉ cần xác định chiều dài 8 và một độ chính xác của 0. Như thế này

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> 

Để thực thi một chiều dài chính xác (tất cả các số phải dài tám chữ số), bạn sẽ cần phải sử dụng một hạn chế KIỂM TRA:

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: Trong oracle, LENGTH() lấy một chuỗi. Điều này có nghĩa là bạn đang sử dụng một loại điểm cố định để biểu diễn một INT, sau đó ngầm đúc nó vào một chuỗi để kiểm tra độ dài của nó. Nó hoạt động, nhưng, * yikes *;) – MatBailie

+1

@Dems - không chắc chắn lý do tại sao bạn đi "yikes". Tôi đã chạy một số kiểm tra đồng hồ treo tường chèn mười nghìn hàng tại một thời điểm và ràng buộc kiểm tra như tôi đã chỉ định nó làm cho * không có sự khác biệt đáng kể * cho thời gian trôi qua. – APC

+1

Thật sao? Đó không phải là những gì tôi mong đợi. Tuy nhiên, như bạn đã thử nghiệm nó và, như bạn nói, không có sự khác biệt * đáng giá *, tôi muốn nói đó là một câu trả lời khá ... +1 – MatBailie

Các vấn đề liên quan