1. ホーム
  2. oracle

[解決済み] ORA-00955 "名前はすでに既存のオブジェクトによって使用されています"

2022-02-03 15:24:19

質問

既存のPKを修正する必要があります。したがって、私はそれをドロップして再作成します。

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

残念ながら、最後のStatementはORA-00955というエラーを出します。

PK制約を元々定義されていたように作成すると。

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

はすべて正常に動作しています。

解決方法は?

おそらく INDEX に関連付けられている PRIMARY KEY CONSTRAINT という名前になっており、また PK_B .

として確認することができます。

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

もしそれが本当なら、.をしてください。

ALTER INDEX "PK_B" RENAME TO "PK_XYZ";

更新情報 について ALTER INDEX という文がありますが、Justinがコメントで述べているように、いくつかの重要な点があります。

オラクルは暗黙のうちに UNIQUE インデックスをサポートします。 PRIMARY KEY CONSTRAINT . このインデックスは主キーと同じ名前であり、主キーが変更されているため、このインデックスは より良い を削除して、古い主キーの定義に従ってインデックスを再作成する必要があります。

私の結論は:

  • 主キー制約は、ユニーク・インデックスによって強制されます。
  • Oracle が既にインデックスを発見している場合(一意か非一意か)、それを使用します。 を主キーに使用します。
  • インデックスが最初に一意でないものとして作成された場合、そのインデックスは引き続き は非ユニークと表示されますが、実際にはユニークインデックスになります。

Arupによる良いデモで、他の面でもかなり詳しく説明されています。 主キーは一意性を保証するのか?もう一度考えてみてください。