同一个表中不同列的多个唯一约束

问题描述 投票:0回答:3

我的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);

我希望这个表的所有列中的所有条目都是完全唯一的。有一种优雅的方式来实现这一目标吗?

sql oracle unique-constraint
3个回答
3
投票

您的列似乎包含一些重复的键,因此当您尝试应用唯一索引时会出现错误。 在设置唯一约束之前,请检查您是否没有任何重复值。


3
投票

您必须先找到并消除列的重复值,然后才能在其上添加唯一约束。

您可以使用以下查询来查找重复值

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;

0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.