【问题标题】:Create Unique Index on a table with duplicate rows in Oracle在Oracle中具有重复行的表上创建唯一索引
【发布时间】:2020-07-07 14:00:52
【问题描述】:

我有一个表,它在 6 个不同的列上有一个 UNIQUE INDEX。但是,表中有重复项。当我删除索引并尝试重新创建它时,它会抛出错误,提示存在重复值。

有没有一种方法可以让我拥有重复的行并仍然创建唯一索引?

我看到约束有 NOVALIDATE 选项。索引有什么类似的吗?

我猜应该有办法,因为表中存在具有有效唯一索引的重复行。

请提供帮助。

【问题讨论】:

  • 您能否解释一下为什么我的问题被否决了。如果您能指出问题,我可以重新表述问题或添加详细信息。我真的需要帮助。
  • 你想防止在多次插入操作中出错,甚至违反唯一性吗?
  • 我希望将来强制执行唯一索引。现在我有重复。我的问题是通过不对我拥有的记录强制执行来创建唯一索引。

标签: sql oracle oracle11g database-indexes


【解决方案1】:

如果您将索引标记为 UNUSABLE,您可以在表上创建唯一索引,即使它有重复项。这意味着索引将存在但系统无法使用它。为此,请使用类似于

的命令
CREATE UNIQUE INDEX UNUSABLE_UNIQUE_IDX_SUCCEEDS
  ON TABLE_WITH_DUPS(ID)
  UNUSABLE

db<>fiddle here

CREATE INDEX docs here

【讨论】:

    【解决方案2】:

    好像您不想在多次插入操作期间出现错误ORA-00001 Unique constraint violated 错误,即使发生违规除非插入的数据提交。然后就可以制作唯一键deferrable initially deferred

    alter table tab
      drop constraint Ukey [cascade]; 
    
    alter table tab
      add constraint Ukey unique ( col1, col2, ..., col6 )
      deferrable initially deferred
    

    上述cascade选项与删除唯一键有关,即使表选项卡的子表中存在外键。

    【讨论】:

    • 我有一个唯一索引,而不是一个约束。
    • 好吧,你可以试试这样,因为如果你创建一个唯一约束,那么一个唯一索引已经被创建@learner。
    • 我没有添加新约束的权限。不会同意的。但我只是想知道如何获得重复记录并且仍然设法首先拥有唯一索引。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2020-06-28
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多