Oracle Merge Into ORA-00001: unique constaint violated问题

这篇具有很好参考价值的文章主要介绍了Oracle Merge Into ORA-00001: unique constaint violated问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近使用Datax同步进行定时数据同步,并在同步完之后进行回调sql进行统计操作。对应的ORACLE表结构如下:

create table DATA_STAT_DAY (
DATA_DATE DATE, 
ID VARCHAR2(2), 
NAME VARCHAR2(2),
CLASSNO VARCHAR2(2),
SCORES NUMBER(16,0)
);

CREATE UNIQUE INDEX IDX_DATA_STAT_DAY ON DATA_STAT_DAY(DATA_DATE, ID, NAME, CLASSNO);

回调对应的SQL如下:

MERGE INTO DATA_STAT_DAY a
USING (
	SELECT 
	DATA_DATE,'0000' AS ID,NAME,CLASSNO, SUM(SCORES) SCORES
	FROM 
	DATA_STAT_DAY 
	WHERE ID % 2 = 0
	GROUP BY DATA_DATE,NAME,CLASSNO
) b 
ON (a.DATA_DATE = b.DATA_DATE and a.ID = b.ID and a.NAME = b.NAME and a.CLASSNO = b.CLASSNO)
WHEN MATCHED THEN 
	UPDATE SET a.SCORES = b.SCORES
WHEN NOT MATCHED THEN 
	INSERT INTO (a.DATA_DATE,a.ID,a.NAME,a.CLASSNO,a.SCORES)
	VALUES (b.DATA_DATE,b.ID,b.NAME,b.CLASSNO,b.SCORES)

回调SQL执行过程中,触发了 ORA-00001: unique constaint violated 的错误,其中USING部分的数据没有重复的,并且表中也没有和USING表中重复的,但是这里面的NAME和CLASSNO字段是有部分字段为NULL,ID部分有重复的值,然后这就导致了MERGE INTO的USING 关联的ON条件的时候判断为没关联上。但是在插入的时候,唯一索引判断重复了,所以对应的USING的数据集的ON部分的字段不能有为NULL的,否则会报唯一索引冲突的问题。

ORACLE的递归查询

SELECT M.MGT_ORG_CODE,
       LPAD(' ', LEVEL * 2, ' ') || M.MGT_ORG_NAME AS MGT_ORG_NAME,
       M.PRNT_MGT_ORG_CODE,
       SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>') AS CODE_PATH,
       REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,1,'i') AS MGT_ORG_C1,
       REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,2,'i') AS MGT_ORG_C2,
       REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,3,'i') AS MGT_ORG_C3,
       REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,4,'i') AS MGT_ORG_C4,
       REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,5,'i') AS MGT_ORG_C5,
       REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,6,'i') AS MGT_ORG_C6,
       CONNECT_BY_ROOT(M.MGT_ORG_CODE) AS ROOT_CODE_VAL,
       CONNECT_BY_ISLEAF AS ISLEAF,
       M.DIST_LV,
       '0' || (LEVEL + 1) AS MGT_LEVEL
  FROM (SELECT T.MGT_ORG_CODE,
               T.DIST_LV,
               T.PRNT_MGT_ORG_CODE,
               T.MGT_ORG_NAME
          FROM M_MGT_ORG T
         WHERE T.MGT_ORG_TYPE = 'corp'
           AND T.VALID_FLAG = '02') M
 START WITH M.DIST_LV = '02'
CONNECT BY NOCYCLE PRIOR M.MGT_ORG_CODE = M.PRNT_MGT_ORG_CODE
 ORDER BY M.MGT_ORG_CODE

START WITH:指定起始节点的条件
CONNECT BY:指定父子行的条件关系
PRIOR:查询父行的限定符,格式:prior column1=column2 or column1=prior column2
NOCYCLE:若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条
循环行:该行只有一个子行,而且子行又是该行的祖先行
CONNECT_BY_ISCYCLE:前置条件:在使用了NOCYCLE之后才能使用此关键字,用于表示是否是循环行,0表示否,1表示是
CONNECT_BY_ISLEAF:是否是叶子节点,0表示否,1表示是
LEVEL:level伪列,表示层级,值越小层级越高,level=1为层级最高节点
CONNECT_BY_ROOT: 可以获取树形查询根记录的字段,start with开始的地方被视为根节点。
SYS_CONNECT_BY_PATH:从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串。文章来源地址https://www.toymoban.com/news/detail-701168.html

到了这里,关于Oracle Merge Into ORA-00001: unique constaint violated问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hive表数据更新insert overwrite/merge into

    根据甲方要求,需要对大数据平台指定表(hive、impala表)的历史数据[2021-01-01至2023-03-29]指定字段进行批量更新,然后把表同步到Oracle。先更新大数据平台上的表,再把更新完成的表同步到Oracle。hive有8张表更新,其中4张大表【分区表】(数据量分别为:1038738976、260958144、2586

    2024年02月08日
    浏览(41)
  • oracle报错:ORA-10997,ORA-09967解决

    报错信息: ORA-10997: another startup/shutdown operation of this instance inprogress ORA-09967: unable to create or open lock file Linux-x86_64 Error: 13: Permission denied 权限问题,修改Oracle目录权限 连接到Oracle重新启动就好

    2024年02月15日
    浏览(30)
  • ORACLE还原恢复启动时数据库报ORA-00704, ORA-00604, ORA-00904

    Oracle数据库还原恢复后,执行alter database open resetlogs时遇到下面错误。如下所示: 刚开始有点懵的,第一次遇到这种情形。不过搜索了一下metalink相关资料后,大致了解到是因为环境变量设置有误导致这些错误出现的。这里先介绍一下这个案例的复杂背景: 当前机器为一个测

    2023年04月13日
    浏览(42)
  • 使用sqlplus连接oracle,提示ORA-01034和ORA-27101

    登录时 登录时  再连接数据库就好了    

    2024年02月13日
    浏览(38)
  • Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞

    异常断电导致数据库无法启动,尝试对数据文件进行recover操作,报ORA-00283 ORA-00742 ORA-00312错误,由于redo写丢失无法正常应用 D:check_dbsqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on 星期日 7月 30 07:49:19 2023 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle.  All rights reserved. 连接到: Oracle

    2024年02月15日
    浏览(39)
  • Oracle 报错ORA-01034: ORACLE not available(Linux),重启

    1.切换到oracle用户 2.重启oracle实例 以上步骤完成后,Linux可本地连接oracle数据库实例。 3.oracle 数据库监听器命令 启动监听器后,才能远程连接。

    2024年04月23日
    浏览(32)
  • oracle报错 ORA-00917: missing comma

    oracle执行sql语句报错,提示 oracle ORA-00917: missing comma 这是由于sql语句中缺少逗号,仔细检查下即可。 执行以下语句发生报错 结果提示: 在sql语句中缺少了逗号,导致报错。

    2024年02月14日
    浏览(29)
  • Oracle19c文档 tnsnames.ora (三)

      官网地址:Local Naming Parameters in the tnsnames.ora File 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 6.9连接数据部分 了解如何使用协议地址配置网络连接。 网络对象由协议地址标识。建立连接后,客户端和请求的接收者(侦听器或 Oracle Connection Manag

    2024年01月21日
    浏览(36)
  • Oracle 解决ORA-00257 Archiver error 报错

    日期: 2023-12-11 作者: Tingy, H 订单投资交易环境进行 impdb 数据泵恢复数据,执行到一半,报错终止。 系统弹出提示: Oralce 安装在 Linux 机器上。 归档策略保留时间较长,或归档频率过高,导致数据库挂载盘符空间不足。 临时处理办法: 手动删除归档文件。 1. 登录 Linux 用

    2024年04月26日
    浏览(34)
  • oracle作业执行失败提示ORA-12011的解决思路

    先说结论:请好好的阅读oracle的alert日志文件,里面的错误提示是很清楚的,精确到行;在plsql里运行作业出错的提示是简略的,容易给人浮躁的心态;如果在ssh工具显示中文为乱码,请设置好工具的字符集问题。 数据库:   12c 发布 1 错误代码:  ORA-12011 描述:  无法执行 %s 作

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包