it-swarm.com.de

ORA-00955 "Name wird bereits von einem vorhandenen Objekt verwendet"

Ich muss eine vorhandene PK ändern. Deshalb lege ich eine neu erstellen.

ALTER TABLE B DROP CONSTRAINT PK_B;
ALTER TABLE B ADD CONSTRAINT PK_B PRIMARY KEY ("TYP", "NR", "HH", "QUART");

Leider wird mir die letzte Anweisung einen Fehler ORA-00955 geben

Wenn ich die PK-Einschränkung so erstellt habe, wie sie ursprünglich definiert wurde:

ALTER TABLE B ADD CONSTRAINT PK_B PRIMARY KEY ("TYP", "NR", "HH");

alles funktioniert gut.

7
My-Name-Is

Möglicherweise gibt es eine INDEX, die dem PRIMARY KEY CONSTRAINT zugeordnet ist, und sie wird auch als PK_B bezeichnet.

Sie können es überprüfen als:

SELECT * FROM USER_INDEXES WHERE TABLE_NAME='<table_name>';

Wenn das stimmt, dann mache:

ALTER INDEX "PK_B" RENAME TO "PK_XYZ";

Update: Bezüglich der ALTER INDEX-Anweisung einige wichtige Punkte, die Justin in den Kommentaren erwähnt

Oracle erstellt implizit einen UNIQUE-Index, um den PRIMARY KEY CONSTRAINT zu unterstützen. Da der Index den gleichen Namen wie der Primärschlüssel hat und jetzt, da der Primärschlüssel geändert wird, ist es besser, den Index gemäß dem Index wieder zu löschen und neu zu erstellen Definition des alten Primärschlüssels.

Meine Schlussfolgerung :

  • Die Primärschlüsseleinschränkung wird durch einen eindeutigen Index erzwungen.
  • Wenn Oracle bereits einen eindeutigen oder nicht eindeutigen Index findet, verwendet es diesen Für den Primärschlüssel.
  • Wenn der Index anfänglich als nicht eindeutig erstellt wurde, wird er weiterhin als nicht eindeutig angezeigt, er ist jedoch ein eindeutiger Index.

Eine gute Demonstration und auch zu anderen Aspekten sehr detailliert, von Arup: Primärschlüssel garantieren Einzigartigkeit? Denk nochmal.

14
Lalit Kumar B

Ich hatte das gleiche Problem, bei dem ich Folgendes tun musste, um den Verweis auf eine Tabelle aus der Ansicht zu löschen, während die Datenbank von Grund auf neu erstellt wurde. Ich habe zuerst in Tabellen und Indizes nach demselben gesucht.

connect sys/Oracle as sysdba;
select * from all_tables
select * from all_indexes
(finally located the reference in the views)
select * from all_views where view_name like '%WKSTSTATE%';
drop view RUEGEN.WKSTSTATE;
0
donsasikumar