2009-05-09 17 views
6

Estoy intentando mover una restricción de clave primaria a una columna diferente en el oráculo. He intentado esto:Quitar y luego agregar una restricción falla en el oráculo

ALTER TABLE MY_TABLE 
DROP CONSTRAINT c_name; 

ALTER TABLE MY_TABLE 
ADD CONSTRAINT c_name PRIMARY KEY 
(
    "COLUMN_NAME" 
) ENABLE; 

Esto produce un error en la restricción de complemento con un error diciendo que el la restricción ya existe a pesar de que acaba de caer. Alguna idea de por qué esto está sucediendo

+0

Debe especificar el nombre de la tabla en algún lugar a lo largo del línea: D –

Respuesta

10

Si la restricción original era una restricción de clave primaria, Oracle crea un índice para aplicar la restricción. Este índice tiene el mismo nombre que la restricción (C_NAME en su ejemplo). Debe soltar el índice por separado de la restricción. Por lo tanto, tendrá que hacer un:

ALTER TABLE <table1> DROP CONSTRAINT C_NAME; 
DROP INDEX C_NAME; 

ALTER TABLE <table1> ADD CONSTRAINT C_NAME PRIMARY KEY 
(COLUMN_2) ENABLE; 
0

No sé si esto es un problema similar pero, en DB2, tiene que comprometerse realmente siguiendo la instrucción alter table. De lo contrario, sigue dando vueltas.

2

La manera más segura es primero agregar un índice único. Prueba esto:

create unique index new_pk on <tabname> (column_2); 

luego dejar caer el viejo PK:

alter table <tabname> drop primary key drop index; 

(Opcional) Cambie el nombre del índice:

alter index new_pk rename to c_name; 

y luego añadir el PK indicando de nuevo el índice que se utilizará:

alter table <tabname> add constraint c_name 
primary key (column_2) using index c_name; 
+0

¿Qué tal si se deja caer la restricción generada por el sistema que aplica no nulo? ¿como hacemos eso? – Toby

Cuestiones relacionadas