Oracle10g ORA-01452:无法创建唯一索引;发现重复的密钥

Oracle10g ORA-01452:无法创建唯一索引;发现重复的密钥,oracle10g,unique-constraint,duplicate-data,Oracle10g,Unique Constraint,Duplicate Data,这可以标记为重复,但我在裁判时发现问题 我有一个表std_tbl,在其中一列中有一些重复的记录,比如说Column_one 我在该列上创建了一个唯一的约束 ALTER TABLE std_tbl ADD CONSTRAINT Unq_Column_One UNIQUE (Column_One) ENABLE NOVALIDATE; 我使用ENABLE NOVALIDATE,因为我希望保留现有的重复记录,并验证未来的重复记录 但在这里,constant不查

这可以标记为重复,但我在裁判时发现问题

我有一个表std_tbl,在其中一列中有一些重复的记录,比如说Column_one

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

ALTER TABLE std_tbl            
ADD CONSTRAINT Unq_Column_One     
UNIQUE (Column_One) ENABLE NOVALIDATE;  
我使用ENABLE NOVALIDATE,因为我希望保留现有的重复记录,并验证未来的重复记录

但在这里,constant不查找区分大小写的单词,比如如果列1的值为'abcd',它允许在表中插入'abcd'和'abcd'

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

CREATE UNIQUE INDEX Unq_Column_One_indx ON std_tbl (LOWER(Column_One));
但这给了我一个错误:

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


请帮助我解决…

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

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

  • 从CREATE UNIQUE INDEX语句中删除UNIQUE关键字,然后重新运行该命令(即,如果值不需要是唯一的)

  • 如果必须是唯一的,请删除导致重复值的无关记录,然后重新运行CREATE unique INDEX语句


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