我的Oracle 11g
数据库中有一个关键表。它有一个index column
,设置为primary key
。第二列包含必须唯一的字符串。我为那个添加了一个unique constraint
。现在还有第三列也应该有一个唯一的约束。
当我使用ALTER TABLE
语句时,我收到错误
'ORA-02299:发现重复键'错误。
我知道可以在多个列上创建一个唯一约束,但这不是我想要的。我需要列独立独立:
ALTER TABLE someTable
ADD CONSTRAINT constraint1_someTable UNIQUE (column2);
ALTER TABLE someTable
ADD CONSTRAINT constraint2_someTable UNIQUE (column3);
我希望这个表的所有列中的所有条目都是完全唯一的。有一种优雅的方式来实现这一目标吗?
您的列似乎包含一些重复的键,因此当您尝试应用唯一索引时会出现错误。 在设置唯一约束之前,请检查您是否没有任何重复值。
您必须先找到并消除列的重复值,然后才能在其上添加唯一约束。
您可以使用以下查询来查找重复值
select column3 from someTable group by column3 having count(*) > 1;
如果无法消除重复值但希望阻止新的重复项,则可以使用非唯一索引使用NOVALIDATE
选项添加唯一约束。
ALTER TABLE someTable
ADD CONSTRAINT constraint2_someTable UNIQUE (column3)
USING INDEX(CREATE INDEX column3_ix ON someTable (column3)) ENABLE NOVALIDATE;
schurik的解决方案应该有效。另一个解决方案是自联接。
select t1.column1, t1.column3, t2.column3
from someTable t1, someTable t2
where t1.column1 = t2.column1
and t1.column3 = t2.column3
and t1.rowid <> t2.rowid