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

时间:2019-02-15 15:44:24

标签: sql oracle unique-constraint

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

我希望该表所有列中的所有条目都是完全唯一的。有没有达到此目的的优雅方法?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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;

答案 2 :(得分:0)

schurik的解决方案应该起作用。 另一个解决方案是自我加入。

library(microbenchmark)
library(ggplot2)

as_numeric_factor2 <- function(x){
  as.numeric(as.character(x))
}


f <- factor(rnorm(1e4))
mb <- microbenchmark(
  levl = as_numeric_factor(f),
  char = as_numeric_factor2(f)
)

autoplot(mb)