1. ホーム
  2. sql

[解決済み] ORA-01408: そのような列のリストはすでにインデックスされています。

2022-02-08 22:46:24

質問

Oracle SQL-Developerは、既に存在するデータベースのテーブル(アイテム)のDDL文を生成します。生成されたDDL文は、新しいデータベースインスタンス内で適用することができないのは非常に不思議です。以下は、DDL の単純化された例です。

CREATE TABLE AB
  (
    "A"      NUMBER(*,0),
    "B"   NUMBER(*,0),
    "C" VARCHAR2(255 BYTE),
    CONSTRAINT "CHK_AB_A_NN" CHECK (A       IS NOT NULL) ENABLE,
    CONSTRAINT "CHK_AB_B_NN" CHECK (B       IS NOT NULL) ENABLE,
    CONSTRAINT "PK_AB" PRIMARY KEY ("A", "B")
  );
CREATE INDEX "IDX_AB_A" ON "AB"("A");
CREATE INDEX "IDX_AB_B" ON "AB"("B");
CREATE UNIQUE INDEX "PK_AB" ON "AB"("A", "B");

これらのステートメントを新しいOracleインスタンス内で実行すると、エラーが発生します。

SQL-Fehler: ORA-01408: Diese Spaltenliste hat bereits einen Index 1. 00000 - "such column list already indexed"

このエラーの原因は何ですか?

解決方法を教えてください。

その部分です。

CONSTRAINT "PK_AB" PRIMARY KEY ("A", "B")

はインデックスを生成しています。インデックスがないと主キー制約は成り立ちません。しかし、その部分。

CREATE UNIQUE INDEX "PK_AB" ON "AB"("A", "B");

は同じカラムでさらに別のインデックスを生成しています。これがエラーの原因です。しかし、Oracleツールが間違ったスクリプトを生成しているのは非常に奇妙です :) もしかしたらバグかもしれません。