2012-01-12 18 views
7

tuttoCome limitare la lunghezza di INTEGER durante la creazione di una tabella in ORACLE?

Quando si crea una tabella in Oracle SQL * Plus, voglio limitare che la lunghezza di una colonna intero può essere solo .

ad es .: il RegNumber è un INTEGER e deve essere un numero di 8 cifre.

Come posso farlo quando creo un tavolo?

+2

vuoi 00000001 da memorizzare come 00000001 o 1, ad es questo numero di 8 cifre ha una lunghezza fissa a prescindere? – Andrew

+0

Per completezza, è -12345678 un numero di otto cifre accettabile nel tuo caso? – pilcrow

+0

sì, voglio che 000000001 venga memorizzato come 00000001, NON 1, perché voglio un numero di 8 cifre, esattamente 8! – MengT

risposta

9

Il tipo di dati INTEGER è solo un sottotipo di NUMERO. È possibile definire la colonna come NUMERO (8,0) per ottenere una colonna intera che sia < = 8 cifre.

Se si sta tentando di assicurare che la colonna è di 8 cifre e solo 8 cifre, è necessario aggiungere un vincolo di controllo per la colonna:

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

+1, Ma perché usare un tipo NUMBER e non un INT? È possibile avere> 9999999 AND <100000000 ... – MatBailie

+0

INT/INTEGER è solo un sottotipo di NUMBER in Oracle definito come NUMBER (38,0). L'archiviazione/le prestazioni sono le stesse poiché l'oracle memorizza i numeri nei campi a lunghezza variabile sul back-end. * Potrebbe * essere un leggero miglioramento della velocità per avere solo un vincolo di controllo invece di due, ma non l'ho provato. –

+0

@Dems, il tuo metodo è buono, ma posso solo inserire valori da 10000000 a 99999999 (non includere 00000000 - 09999999), sono tutti numeri a 8 cifre, ma esiste qualche metodo che consideri 00000001 anche un numero di 8 cifre valido? – MengT

2

Basta specificare una lunghezza di 8 e una precisione di 0. Ti piace questa

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> 

Per applicare una lunghezza esatta (tutti i numeri devono avere una lunghezza di otto cifre) è necessario utilizzare un vincolo 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: In oracle, LENGTH() prende una stringa. Ciò significa che stai utilizzando un tipo di punto fisso per rappresentare un INT, quindi lo trasmetti implicitamente a una stringa per verificarne la lunghezza. Funziona, ma, * yikes *;) – MatBailie

+1

@Dems - non sono sicuro del motivo per cui si va "yikes". Ho eseguito alcuni test wall-clock inserendo diecimila righe alla volta e il vincolo di controllo come specificato non fa * nessuna differenza apprezzabile * al tempo trascorso. – APC

+1

Davvero? Non è quello che mi aspettavo. Come, tuttavia, hai provato e, come dici tu, non c'è * differenza apprezzabile *, direi che è una risposta decente quindi ... +1 – MatBailie

Problemi correlati