2012-01-12 9 views
7

todo¿Cómo restringir la duración de INTEGER al crear una tabla en ORACLE?

Al crear una tabla en Oracle SQL * Plus, que desee restringir que la longitud de una columna INTEGER puede ser solamente .

por ejemplo: el RegNumber es un INTEGER, y debe ser un número de 8 dígitos.

¿Cómo puedo hacer esto cuando creo una tabla?

+2

qué quiere 00000001 a ser almacenados como 00000001 o 1, por ej. ¿Es este número de 8 dígitos una longitud fija independientemente? – Andrew

+0

Para completar, ¿es -12345678 un número aceptable de ocho dígitos en su caso? – pilcrow

+0

sí, quiero que 000000001 se almacene como 00000001, NO 1, porque quiero un número de 8 dígitos, ¡exactamente 8! – MengT

Respuesta

9

El tipo de datos INTEGER es solo un subtipo de NÚMERO. Puede definir la columna como NÚMERO (8,0) para obtener una columna entera que es < = 8 dígitos.

Si usted está tratando de asegurarse de que la columna es de 8 dígitos y sólo 8 dígitos, que necesitará añadir una restricción de comprobación en la columna:

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

+1, pero, ¿por qué usar un tipo NÚMERO y no un INT? Puede tener> 9999999 AND <100000000 ... – MatBailie

+0

INT/INTEGER es solo un subtipo de NUMBER en Oracle que se define como NUMBER (38,0). El almacenamiento/rendimiento es el mismo ya que Oracle almacena números en campos de longitud variable en el back-end. Puede * ser una ligera mejora de velocidad para tener solo una restricción de verificación en lugar de dos, pero no he probado eso. –

+0

@Dems, su método es bueno, pero solo puedo insertar valores de 10000000 a 99999999 (no incluyen 00000000 - 09999999), todos son números de 8 dígitos, pero ¿hay algún método posible que considere 00000001 también un número válido de 8 dígitos? – MengT

2

Sólo especifique una longitud de 8 y una precisión de 0. gusta esta

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> 

Para hacer cumplir una longitud exacta (todos los números deben ser de ocho dígitos de longitud) que tendrá que utilizar una restricción 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: en oráculo, LENGTH() toma una cadena. Esto significa que está usando un tipo de punto fijo para representar una INT, y luego lo está implícitamente lanzando a una cadena para verificar su longitud. Funciona, pero, * yikes *;) – MatBailie

+1

@Dems - no estoy seguro de por qué vas "yikes". He realizado algunas pruebas de reloj de pared insertando diez mil filas a la vez y la restricción de verificación, tal como lo especifiqué, * no hace una diferencia apreciable * con respecto al tiempo transcurrido. – APC

+1

¿De verdad? Eso no es lo que esperaba. Como, sin embargo, lo ha probado y, como usted dice, no hay una diferencia * apreciable *, diría que es una respuesta decente, entonces ... +1 – MatBailie

Cuestiones relacionadas