我的表中有一个复合唯一索引,但是由于商业原因,我不得不从索引中取出一列。所以我删除了索引。现在,由于减少了列数,因此在创建索引时会引发错误:ORA-01452:无法创建唯一索引;找到重复的密钥。
以前,索引还有一列,并且一切正常。
CREATE UNIQUE INDEX MGRRS.ITRCHESS ON MGRRS.TTRCHESS (MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG) TABLESPACE IMGRRS LOCAL
*
ERROR at line 1:
ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found
注意1:请注意,我尚未从表格中删除该列。
答案 0 :(得分:2)
要在多个列上建立唯一索引,这些列的所有组合必须是唯一的。也就是说,对于五列的复合索引,我们可以在四列中具有多个相同值的实例,前提是第五列包含不同的值以在所有五列中提供唯一的组合。
您遇到的情况是您由于业务原因而从索引中删除了一列。这意味着您丢失了为您提供唯一组合的列。因此,您无法在其余四列上建立唯一索引。
您的选项:
这既是政治问题,又是技术问题。似乎有人提出了一个建议-“市场营销部门的杰伊说,我们必须从索引中删除COLUMN_23” -但是影响分析以及所有其他需要更改的方面尚未完成正确地。
因此,我们可以提供建议,但不能提供解决方案。我们不知道为什么首先要有一个唯一索引,也不知道为什么有人认为您需要从索引中删除一个列。这是您的业务逻辑,数据模型和应用程序:只有您才能确定正确的方法。
答案 1 :(得分:1)
您有重复的数据,可以使用
找到它SELECT MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG
FROM MGRRS.ITRCHESS
GROUP BY MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG
HAVING COUNT(1) > 1
答案 2 :(得分:0)
ORA-01452表示为索引建议的字段组合不是唯一的。您不能在非唯一列的组合上创建UNIQUE索引。
您最初在索引中有五列,而这些列的组合是唯一的。
您从索引中删除了一个字段。现在,索引中的四个字段(MHYSTU,MAJUSDESK,DATSNAQ,TIMESSDG)的组合并不唯一。
您的选择是:
从索引定义中删除单词UNIQUE
:
CREATE INDEX MGRRS.ITRCHESS
ON MGRRS.TTRCHESS (MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG)
TABLESPACE IMGRRS
LOCAL
删除表中的行,以便表中的每个组合(MHYSTU,MAJUSDESK,DATSNAQ,TIMESSDG)只有一行。
好运。