oracle唯一约束
Posted
技术标签:
【中文标题】oracle唯一约束【英文标题】:oracle unique constraint 【发布时间】:2012-12-29 12:20:25 【问题描述】:我正在尝试将一个表中的不同值插入到另一个表中。我的目标表有一个主键studentid
,当我从源到目标执行不同的id
时,加载成功。当我尝试将一堆列从源加载到目标时,包括student_id
,我收到一个错误违反了唯一约束。目标上只有一个约束,即studentid
上的主键。
我的查询看起来像这样(只是一个例子)
insert into target(studentid, age, schoolyear)
select distinct id, age, 2012 from source
为什么上面的查询返回一个错误,而下面的查询工作得很好
insert into target(studentid)
select distinct id from source
帮我解决这个问题。
感谢您的宝贵时间。
【问题讨论】:
您需要决定哪些行用于多个id
,正如下面第一个答案中所指出的,其他列是not 不同的。您将需要执行一些聚合 MIN(),MAX()
等。
感谢您的回复。我明白这个问题。我想要 id 的唯一值和其余列的相应值。我怎样才能做到这一点。 ?
【参考方案1】:
在您的第一个查询中,您选择了三列的不同组合,即,
select distinct id, age, 2012 from source
不仅仅是独特的 id。在这种情况下,可能会出现重复 ID。 例如,您上面的查询对此有效
id age
1 23
1 24
1 25
2 23
3 23
但是在您的第二个查询中,您只选择了不同的 id
select distinct id from source
所以这会返回,
id
1
2
3
在这种情况下,没有办法重复,您插入到目标中也不会 失败。
如果您真的想在目标上进行批量插入,那么请选择 任何聚合函数
select id, max(age), max(2012) group by id from source
或者,如果您不想从源到目标丢失任何记录,则删除对目标的约束并将其插入。
希望对你有帮助
【讨论】:
所以我把id放在括号里可以吗? 如果您只关心 id 列,那么 distinct id 是完美的。 是的,我现在明白这个问题了。那么处理它的正确方法是什么。我尝试将此插入到目标(学生编号,年龄,学年)中选择(不同的 id),年龄,2012 年,但我缺少表达式错误。 您不想丢失从源到目标的任何记录??我的意思是记录数。如果你不想丢失记录,那么你应该删除你的约束然后插入..否则你可以做这样的事情..我正在更新我的答案 问题是我想要 id 的唯一值和其余列的相应值。我怎样才能做到这一点。 ?以上是关于oracle唯一约束的主要内容,如果未能解决你的问题,请参考以下文章