【发布时间】: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