我的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);
我希望该表所有列中的所有条目都是完全唯一的。有没有达到此目的的优雅方法?
答案 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)