ORA-01408:此列列表已编入索引

My-*_*-Is 5 sql oracle oracle-sqldeveloper

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");
Run Code Online (Sandbox Code Playgroud)

如果我在新的oracle实例中执行这些语句,我会收到错误:

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

这个错误的原因是什么?

Ale*_*lak 13

那个部分:

CONSTRAINT "PK_AB" PRIMARY KEY ("A", "B")
Run Code Online (Sandbox Code Playgroud)

正在生成一个索引.没有索引,主键约束不能存在.但是,部分:

CREATE UNIQUE INDEX "PK_AB" ON "AB"("A", "B");
Run Code Online (Sandbox Code Playgroud)

正在生成具有相同列的另一个索引.这就是错误的原因.很奇怪,Oracle工具生成了错误的脚本:)也许这是一个错误.


tvm*_*tvm 5

您在 CREATE TABLE 语句中的主键约束会自动在 ("A","B") 上创建唯一索引,因为它是主键。然后引发错误,因为您尝试在相同的列上重新创建现有的 UNIQUE INDEX。

更新:我已经使用 Oracle SQL Developer 3.2.20.09 对其进行了测试,并且不存在上述问题。您可能使用旧版本吗?