Oracle:ORA-01408:这样的列列表已经编入索引

时间:2016-01-26 17:38:28

标签: oracle indexing

我创建了一个表:

CREATE TABLE SCHEMA_NAME.TABLE_NAME
(
  ID VARCHAR2(100) PRIMARY KEY NOT NULL,
  A_ID VARCHAR2(100) NOT NULL,
  B_ID VARCHAR2(100),
  C_ID INTEGER,
  CONSTRAINT FK_C_NOTE FOREIGN KEY (C_ID) REFERENCES C(ID),
  CONSTRAINT FK_A_NOTE FOREIGN KEY (A_ID) REFERENCES A(ID),
  CONSTRAINT FK_B_NOTE FOREIGN KEY (B_ID) REFERENCES B(ID)
);

我尝试应用以下索引:

CREATE INDEX IDX_FK_A_TABLE_NAME on SCHEMA_NAME.TABLE_NAME(A_ID) tablespace TS_SCHEMA_NAME_DATA;
CREATE INDEX IDX_FK_C_TABLE_NAME on SCHEMA_NAME.TABLE_NAME(C_ID) tablespace TS_SCHEMA_NAME_DATA; --Fails
CREATE INDEX IDX_FK_B_TABLE_NAME on SCHEMA_NAME.TABLE_NAME (B_ID) tablespace TS_SCHEMA_NAME_DATA; --Fails

但是当我尝试创建最后两个索引时,我得到了:

  

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

这是为什么?这些索引是自动创建的吗?

如果我尝试:

SELECT INDEX_NAME FROM ALL_INDEXES WHERE TABLE_NAME = 'NOTE';

我明白了:

INDEX_NAME
----------
IDX_FK_A_TABLE_NAME
SYS_C0044692561

1 个答案:

答案 0 :(得分:2)

通过查询ALL_IND_COLUMN(如果有访问权限,则检查DBA_IND_COLUMNS)来仔细检查索引列。它将显示哪些表列由哪个索引编制索引。

SELECT c.index_owner, c.index_name, c.table_owner, c.table_name, c.column_name, c.column_position
  FROM all_ind_columns c
 WHERE c.table_owner = 'SCHEMA_NAME'
       AND c.table_name = 'NOTE'
 ORDER BY c.index_owner, c.index_name, c.column_position;

在站点注释中,在创建索引时,不要为它们添加架构所有者(CREATE INDEX SCHEMA.IDX_FK_A_TABLE_NAME ...)。这意味着它们是在您当前的架构中创建的。另一方面,它可能与你所面临的错误无关。