La Web del Programador: Comunidad de Programadores
 
    Pregunta:  28757 - ORACLE: CAMBIO DE TIPO EN UNA PRIMARY KEY
Autor:  Teoriko Oko
Supongamos que tengo una primary key definida como:
DNI number(8) ,
constraint clave primary key(DNI);
como puedo pasar a
NIF varchar2(9) <------- ya que quiero añadir una letra a la secuencia
de numeros de DNI. Ademas quiero que los datos de otras tablas que referenciaban a DNI ahora referencien a NIF .
¿Es posible realizar ese cambio sin usar PL/SQL ?
¿Como? Y si no es posible, podríais señalarme los pasos a seguir?
GRACIAS

  Respuesta:  Alixandro Florian
Sr. Oko,

Tienes que convertir el campo DNI a varchar2, ademas borrar el constraint que hace referencia al Pk ( debes saber como se llama el Pk) y crearlo de nuevo cuando haya hecho el cambio a varchar2.

Para Cambiar a varchar2:
alter table nombre_tabla modify DNI varchar2(9);

Para borrar el constraint del pk:
alter table nombre_table drop constraint nombre_constraint cascade;

Para crear el constraint :
alter table nombre_tabla add constraint pk_xxxxxxxx primary key (DNI);

Nota: Debes conocer la regla para convertir campos de varchar a number o de number a varchar.

Si te da este error:
SQL> alter table oko modify DNI varchar2(9);
alter table oko modify DNI varchar2(9)
*
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype

es porque el campo ''la tabla'' tienes que estar vacia.

para vaciar la tabla:
delete nombre_tabla cascade; /* esto borra todas las columnas */

Si los datos son importante debes crear una copia de la tabla original,
para conservar los datos, para luego insetarlo.

para crear copia:
create table nombre_tabla_copia as select * from nombre_tabla_original;

suerte.