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唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库主键约束与唯一索引有啥区别?

Oracle数据库主键约束与唯一索引有啥区别?

Oracle数据库中违反唯一约束的处理

oracle数据库添加,查询,删除唯一约束

Oracle数据库,非空约束主键约束外键约束唯一约束

oracle 如何创建,可空唯一约束