Oracle10g ORA-01452:无法创建唯一索引;发现重复的密钥
这可以标记为重复,但我在裁判时发现问题 我有一个表std_tbl,在其中一列中有一些重复的记录,比如说Column_one 我在该列上创建了一个唯一的约束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不查
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语句时,会发生这种情况 两种解决方法(据我所知):
我不想删除这些记录。是否存在类似于NOVALIDATE的内容,以便忽略现有的重复项?要求是,只有未来的记录才应进行验证,因为现有记录在其他表中具有键。这是有道理的,因为诺瓦利达只是为了这个目的。ENABLE NOVALIDATE的唯一问题是,它区分大小写。如果表中有两个相同的值-
abcd
两次,例如,使用相同的大小写-ALTER table
将抛出ORA-02299,尽管有NOVALIDATE
,因为它将无法创建唯一的索引来备份它。在11g中,您可以创建一个虚拟列并对其进行约束,但创建唯一索引时也会遇到同样的问题。您必须首先创建一个非唯一索引,并使用它来备份唯一约束。我不认为你能在10g中得到这样的综合效果,除非你用一个真实的列和一个触发器来模拟虚拟列。