2009-05-09 7 views
6

Sto provando a spostare un vincolo di chiave primaria su un'altra colonna in Oracle. Ho provato questo:Eliminazione in seguito all'aggiunta di un vincolo non riuscito in Oracle

ALTER TABLE MY_TABLE 
DROP CONSTRAINT c_name; 

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

Questo non sul vincolo aggiuntivo con un errore dicendo che il vincolo esiste già anche se ho appena fatto cadere. Qualche idea sul perché questo stia accadendo

+0

È necessario specificare il nome della tabella da qualche parte lungo il riga: D –

risposta

10

Se il vincolo originale era un vincolo di chiave primaria, Oracle crea un indice per applicare il vincolo. Questo indice ha lo stesso nome del vincolo (C_NAME nel tuo esempio). È necessario eliminare l'indice separatamente dal vincolo. Quindi è necessario:

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

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

Non so se questo è un problema simile ma, in DB2, devi effettivamente eseguire il commit seguendo l'istruzione alter table. Altrimenti è ancora in giro.

2

Il modo più sicuro è innanzitutto aggiungere un indice univoco. Prova questo:

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

quindi rilasciare il vecchio PK:

alter table <tabname> drop primary key drop index; 

(opzionale) Rinomina l'indice:

alter index new_pk rename to c_name; 

e quindi aggiungere il PK nuovo che indica l'indice da utilizzare:

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

come eliminare il vincolo generato dal sistema che applica non nulla? Come lo facciamo? – Toby

Problemi correlati