【问题标题】:Error while creating unique index in Oracle: ORA-01452在 Oracle 中创建唯一索引时出错:ORA-01452
【发布时间】:2019-03-30 06:55:38
【问题描述】:

我的表中有一个复合唯一索引,但由于业务原因,我不得不从索引中取出其中一列。所以我放弃了索引。现在,随着列数的减少,它在创建索引时会引发错误:ORA-01452: cannot CREATE UNIQUE INDEX;找到重复的键。

以前索引有一个额外的列,一切正常。

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:请注意,我没有从表中删除该列。

【问题讨论】:

  • 你已经有重复的数据了..你应该先摆脱它
  • 由于业务原因也许您可以使索引不唯一?
  • @samantarighpeima - 他们没有重复的数据。如果我们在五列上有一个复合索引,我们可以在四列中有多个相同值的实例,前提是所有五列的组合是不同的
  • 什么样的列组合是独特的,最终是业务的问题。这就是我们有实体模型的原因。

标签: oracle indexing


【解决方案1】:

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

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

您的选择:

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

这既是一个技术问题,也是一个政治问题。似乎有人提出了一个建议 - “来自市场部的 Jay 说我们必须从索引中删除 COLUMN_23” - 但影响分析以及所有其他需要更改的内容尚未完成适当地。

所以我们可以提供建议,但我们无法提供解决方案。我们不知道为什么您首先拥有唯一索引,也不知道为什么有人决定您需要从索引中删除其中一列。这是您的业务逻辑、您的数据模型和您的应用程序:只有您可以决定正确的方法。

【讨论】:

    【解决方案2】:

    你有重复的数据,你可以找到它使用

    SELECT MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG
    FROM MGRRS.ITRCHESS
    GROUP BY MHYSTU, MAJUSDESK, DATSNAQ, TIMESSDG
    HAVING COUNT(1) > 1
    

    【讨论】:

    • 问题是,OP 没有重复数据,但随后他们删除了一列,现在剩余的列不再是唯一的组合。那么一旦确定了重复项,他们会做什么?
    • 好的,为了澄清,我们没有从表中删除该列,我们只是删除了包含该列的索引。
    【解决方案3】:

    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) 的每个组合在表中只有一行。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 2015-03-22
      • 1970-01-01
      • 2016-08-01
      • 2020-06-02
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多