我创建了一个表:
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
答案 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 ...)。这意味着它们是在您当前的架构中创建的。另一方面,它可能与你所面临的错误无关。