【问题标题】:ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys foundORA-01452: 无法创建唯一索引;发现重复键
【发布时间】:2014-08-26 11:25:42
【问题描述】:

这可以标记为重复,但我在裁判时发现问题 Create Unqiue case-insensitive constraint on two varchar fields

我有一个表 std_tbl,其中一列中有一些重复的记录,比如 Column_One。

我在该列上创建了一个唯一约束

ALTER TABLE std_tbl            
ADD CONSTRAINT Unq_Column_One     
UNIQUE (Column_One) ENABLE NOVALIDATE;  

我使用 ENABLE NOVALIDATE 是因为我想保留现有的重复记录并验证未来的重复记录。

但在这里,该约束不查找区分大小写的单词,例如如果 Column_One 的值为 'abcd',它允许在表中插入 'Abcd' 和 'ABCD'。

我希望此行为不区分大小写,以便它在验证数据时不查找大小写。为此,我想出了这个解决方案。

CREATE UNIQUE INDEX Unq_Column_One_indx ON std_tbl (LOWER(Column_One));

但它给了我错误:

ORA-01452: 无法创建唯一索引;发现重复键

请帮帮我...

【问题讨论】:

  • 我不想删除这些记录。有没有类似 NOVALIDATE 这样它会忽略现有的重复项?
  • 要求只有未来的记录应该被验证,因为现有记录在其他表中有键。这是有道理的,因为 ENABLE NOVALIDATE 仅用于此目的。 ENABLE NOVALIDATE 的唯一问题是,它区分大小写。
  • 如果表中有两个相同的值 - abcd 两次,例如,相同的情况 - 那么你的 ALTER TABLE 会抛出 ORA-02299,尽管有 NOVALIDATE,因为它不会无法创建唯一索引来备份它。在 11g 中,您可以创建一个虚拟列并对其进行约束,但是您在创建唯一索引时遇到了同样的问题。您必须首先创建一个非唯一索引并使用它来备份唯一约束。不过,我认为您无法在 10g 中获得这种组合效果,除非您使用真实列和触发器来模拟虚拟列。

标签: oracle10g unique-constraint duplicate-data


【解决方案1】:

当您尝试对包含重复值的一个或多个列执行 CREATE UNIQUE INDEX 语句时会发生这种情况。

两种解决方法(据我所知):

  1. 从 CREATE UNIQUE INDEX 语句中删除 UNIQUE 关键字并重新运行命令(即,如果值不需要唯一)。

  2. 如果它们必须是唯一的,请删除导致重复值的无关记录并重新运行 CREATE UNIQUE INDEX 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2014-12-29
    • 2015-03-22
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多