2012-02-10 48 views
30

Actualmente tengo una columna que se declara como NÚMERO. Quiero cambiar la precisión de la columna a NÚMERO (14,2).Cambiar la precisión de la columna numérica en Oracle

SO, me encontré con el comando

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2)' 

para lo cual, me dio un error:

column to be modified must be empty to decrease precision or scale 

conjeturo que quiere que la columna esté vacío mientras cambia la precisión y Don No sé por qué dice que queremos disminuirlo mientras lo estamos aumentando, los datos en las columnas no se pueden perder. ¿Hay una breve solución para esto? No quiero copiarlo en otra tabla y soltarlo después, ni cambiar el nombre de una columna y copiar entre columnas, porque existe el riesgo de perder datos entre las transferencias y las caídas.

Respuesta

59

Suponiendo que no estableció una precisión inicialmente, se supone que es el máximo (38). Estás reducir la precisión debido a que está cambiando es de 38 a 14.

La forma más fácil de manejar esto es cambiar el nombre de la columna, copiar los datos a través de, a continuación, colocar la columna original:

alter table EVAPP_FEES rename column AMOUNT to AMOUNT_OLD; 

alter table EVAPP_FEES add AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_OLD; 

alter table EVAPP_FEES drop column AMOUNT_OLD; 

Si realmente desea conservar el orden de columna, puede mover los datos dos veces en vez:

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2); 

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT; 

update EVAPP_FEES set AMOUNT = null; 

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP; 

alter table EVAPP_FEES drop column AMOUNT_TEMP; 
+1

¿cuál es la diferencia entre estas soluciones? – BrownFurSeal

+4

@BrownFurSeal: la primera solución moverá la columna modificada, de modo que se convierta en la última columna de la tabla. La segunda solución conservará el orden original de las columnas. – Allan

+0

El primer método destruye la columna (lo que puede causar problemas si la columna se utiliza en algún lugar). El segundo método no es destructivo, pero requiere que la columna sea nulable. Si no admite nulos, deberá agregar comandos para que se pueda agregar un valor nulo, y luego restaurarlo para que no acepte nulos después del cambio. – ADTC

1

Al configurar la báscula, disminuye la precisión. Pruebe NUMBER (16,2).

+0

Probé todos los números del 1 al 38 y sigo teniendo el mismo error. – roymustang86

+0

Perdón, leí mal la publicación. Cuando define una columna con NÚMERO, le asigna el valor máximo de 38, por lo tanto, cualquier escala disminuirá la precisión con la posibilidad de que se pierdan datos. ¿Por qué crees que puedes perder algunos datos creando una nueva tabla y copiando datos de la anterior? –

+0

Hay miles de registros, y en caso de que una de las sentencias update/alter falle, es posible que no haya forma de deshacerlo – roymustang86

0

Si se comprime la tabla esto funcionará:

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2); 

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT; 

update EVAPP_FEES set AMOUNT = null; 

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP; 

alter table EVAPP_FEES move nocompress; 

alter table EVAPP_FEES drop column AMOUNT_TEMP; 

alter table EVAPP_FEES compress; 
Cuestiones relacionadas