SQL插入的唯一约束-ORACLE

Posted

技术标签:

【中文标题】SQL插入的唯一约束-ORACLE【英文标题】:Unique constraint on SQL insert -ORACLE 【发布时间】:2014-03-10 22:58:06 【问题描述】:

我正在运行一个脚本,该脚本会触发一个选择查询并将结果插入到一个表中。

选择查询是

select distinct a.child child_id, a.parent parent_id from cat a, par b WHERE a.child=b.catentid and b.catenttype_id='Product' and a.reltype_id='PRODUCT_ITEM'

并插入到创建为

的表中
create table TI_CAT_0 ( child_id NUMBER not null,parent_id NUMBER not null,PRIMARY KEY (child_id))

但我在以“SYS_C00187123”身份运行脚本时遇到了唯一键约束违规,我在 all_constraints 表中检查了这个约束名称,并且只在 TI_CAT_0 表中检查了它。

由于我使用 distinct 命令,我不确定为什么会出现这种违规行为。它是一个 Oracle 数据库。

【问题讨论】:

您确定您选择的child_id 不存在于TI_CAT_0 表中 distinct 对 select 的 all 列进行操作,而不仅仅是第一列。因此,child_id 的值可以相同,parent_id 的值不同,它仍然是不同的。 @a_horse_with_no_name 那么我们有什么办法可以拥有不同的子 ID? 【参考方案1】:

假设您从头开始创建 TI_CAT_0 表并从您的 SELECT 查询中插入记录,那么您要么无意中多次插入同一记录,要么您的初始查询为每个 child_id 返回多行.如果是这种情况,您应该运行此查询以查看您的初始查询是否返回重复的 child_id 值。编写的查询将返回child_idparent_id 的唯一组合。您可以使用以下 SQL 检查多个父母是否与单个孩子相关联:

select 
    a.child, 
    count(a.parent) as parent_count
from 
    cat a
    join par b 
        on a.child = b.catentid 
where 
    b.catenttype_id='Product' 
    and a.reltype_id='PRODUCT_ITEM'
group by 
    a.child
having
    count(a.parent) > 1
order by 2 desc

结果(如果有)将是与多个 parent_id 值关联的所有 child_id 值。

【讨论】:

以上是关于SQL插入的唯一约束-ORACLE的主要内容,如果未能解决你的问题,请参考以下文章

oracle唯一约束

复合唯一键约束,其中一列中包含多个空值

SQL中如何设置唯一性约束

oracle 禁用唯一性约束该如何写语句? 我的表名是OEM_REPOSITORY

oracle 数据库 - 插入具有唯一键约束的表显示当值实际重复时插入 1 行。 - 发生在函数中

Oracle 空和唯一约束