在Oracle中创建唯一索引时出错:ORA-01452

时间:2019-03-30 06:55:39

标签: oracle indexing

我的表中有一个复合唯一索引,但是由于商业原因,我不得不从索引中取出一列。所以我删除了索引。现在,由于减少了列数,因此在创建索引时会引发错误: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:请注意,我尚未从表格中删除该列。

3 个答案:

答案 0 :(得分:2)

要在多个列上建立唯一索引,这些列的所有组合必须是唯一的。也就是说,对于五列的复合索引,我们可以在四列中具有多个相同值的实例,前提是第五列包含不同的值以在所有五列中提供唯一的组合。

您遇到的情况是您由于业务原因而从索引中删除了一列。这意味着您丢失了为您提供唯一组合的列。因此,您无法在其余四列上建立唯一索引。

您的选项:

  1. 将放置的列恢复到索引中。这可能不切实际,具体取决于导致这种情况的业务驱动因素。
  2. 识别具有共享组合as @PhilippeMarschall shows的记录,并更新或删除它们。这似乎是最不希望的选择。
  3. 如果出于性能原因需要某些内容,请创建一个非唯一索引。您应该运行一些测试。
  4. 不要打扰索引。如果索引不满足性能要求,请执行此操作。

这既是政治问题,又是技术问题。似乎有人提出了一个建议-“市场营销部门的杰伊说,我们必须从索引中删除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)的组合并不唯一。

您的选择是:

  1. 将删除的字段放回索引中。
  2. 从索引定义中删除单词UNIQUE

    CREATE INDEX MGRRS.ITRCHESS ON MGRRS.TTRCHESS (MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG) TABLESPACE IMGRRS LOCAL

  3. 删除表中的行,以便表中的每个组合(MHYSTU,MAJUSDESK,DATSNAQ,TIMESSDG)只有一行。

好运。