同一 table 中不同列的多个唯一约束
Multiple unique constraints on different columns in the same table
我的 Oracle 11g
数据库中有一个至关重要的 table。它有一个 index column
被设置为 primary key
。第二列包含必须唯一的字符串。我为那个添加了一个 unique constraint
。现在有第三列也应该有唯一约束。
当我使用 ALTER TABLE
语句时出现错误
'ORA-02299: duplicate keys found' error.
我知道可以在多个列上创建唯一约束,但这不是我想要的。我需要列独立唯一:
ALTER TABLE someTable
ADD CONSTRAINT constraint1_someTable UNIQUE (column2);
ALTER TABLE someTable
ADD CONSTRAINT constraint2_someTable UNIQUE (column3);
我希望此 table 的所有列中的所有条目都是完全唯一的。有没有一种优雅的方法可以实现这一目标?
您的列似乎包含一些重复的键,因此当您尝试应用唯一索引时出现错误。
在设置唯一约束之前检查您没有任何重复值。
您必须找到并消除该列的重复值,然后才能对其添加唯一约束。
您可以使用以下查询来查找重复值
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
我的 Oracle 11g
数据库中有一个至关重要的 table。它有一个 index column
被设置为 primary key
。第二列包含必须唯一的字符串。我为那个添加了一个 unique constraint
。现在有第三列也应该有唯一约束。
当我使用 ALTER TABLE
语句时出现错误
'ORA-02299: duplicate keys found' error.
我知道可以在多个列上创建唯一约束,但这不是我想要的。我需要列独立唯一:
ALTER TABLE someTable
ADD CONSTRAINT constraint1_someTable UNIQUE (column2);
ALTER TABLE someTable
ADD CONSTRAINT constraint2_someTable UNIQUE (column3);
我希望此 table 的所有列中的所有条目都是完全唯一的。有没有一种优雅的方法可以实现这一目标?
您的列似乎包含一些重复的键,因此当您尝试应用唯一索引时出现错误。
在设置唯一约束之前检查您没有任何重复值。
您必须找到并消除该列的重复值,然后才能对其添加唯一约束。
您可以使用以下查询来查找重复值
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