oracle insert忽略重复数据,Oracle’INSERT ALL’忽略重复项

我有一个具有唯一约束的数据库表(唯一的(DADSNBR, DAROLEID)对)。 我将同时向该表中插入多个值,因此我想使用一个查询来完成它-我假设这将是更快的方法。 因此,我的查询是:

INSERT ALL

INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 1)

INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 2)

INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 3)

INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 4)

SELECT 1 FROM DUAL

由于语句中的某些条目与数据库中已有的条目重复,因此整个插入操作将失败,并且不会插入任何行。

有没有办法忽略唯一约束失败的情况,而只插入唯一约束,而不必将其拆分为单独的INSERT语句?

编辑:我意识到我可能仍然不想这样做,但是我仍然对是否可行感到好奇。

您所有的行都不是重复的(?!)

我的意思是,它们是执行插入语句之前数据库中已经存在的值的重复项。 为了清楚起见,编辑了我的问题。

在Oracle中,语句要么完全成功要么完全失败(它们是原子的)。 但是,您可以在某些情况下添加子句以记录异常,而不是引发错误:

使用BULK COLLECT - SAVE EXCEPTIONS,如askTom上的该线程所示,

或使用DBMS_ERRLOG(我认为自10g起可用)。

第二种方法是全自动的,这是一个演示(使用11gR2):

SQL> CREATE TABLE test (pk1 NUMBER,

2                     pk2 NUMBER,

3                     CONSTRAINT pk_test PRIMARY KEY (pk1, pk2));

Table created.

SQL> /* Statement fails because of duplicate */

SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2);

ERROR at line 1:

ORA-00001: unique constraint (VNZ.PK_TEST) violated

SQL> BEGIN dbms_errlog.create_error_log('TEST'); END;

2  /

PL/SQL procedure successfully completed.

SQL> /* Statement succeeds and the error will be logged */

SQL> INSERT into test (SELECT 1, 1 FROM dual CONNECT BY LEVEL <= 2)

2   LOG ERRORS REJECT LIMIT UNLIMITED;

1 row(s) inserted.

SQL> select ORA_ERR_MESG$, pk1, pk2 from err$_test;

ORA_ERR_MESG$                                       PK1 PK2

--------------------------------------------------- --- ---

ORA-00001: unique constraint (VNZ.PK_TEST) violated   1   1

您可以将LOG ERROR子句与INSERT ALL一起使用(感谢@Alex Poole),但是必须在每个表之后添加该子句:

SQL> INSERT ALL

2   INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED

3   INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED

4  (SELECT * FROM dual);

0 row(s) inserted.

它确实适用于INSERT ALL,但是您需要在每个INTO ...之后放置一个LOG ERRORS子句,如文档中斜一点所示。因此,在这种情况下INSERT ALL INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED SELECT * FROM dual。这可能很有意义,因为INTO可能适用于不同的表。

@AlexPoole谢谢,我不知道。这说得通 !

DBMS_ERRLOG很好用,我不必更改查询结构-感谢分享!但是,有一件事是,因为记录错误而不是首先避免这些错误,因为使用这种方法要谨慎一些,因为它会占用大量空间/资源吗?

@Maccath涉及额外的工作。如果您运行大量插入操作并且您对日志不感兴趣,则最好按照@a_horse_with_no_names答案重写查询。

使用MERGE语句来处理这种情况:

merge into"ACCESS" a

using

(

select 68 as DADSNBR,1 as DAROLEID from dual union all

select 68,2 from dual union all

select 68,3 from dual union all

select 68,4 from dual

) t

on (t.DADSNBR = a.DADSNBR and t.DAROLEID = a.DAROLEID)

when not matched then

insert (DADSNBR, DAROLEID)

values (t.DADSNBR, t.DAROLEID);

嗨,我尝试使用以下查询,但出现错误。我无法立即看到问题出在哪里,但是我还没有注意到Oracle。 ORA-00928: missing SELECT keyword: merge into DADSNBR using ( select :q0 as DADSNBR, :q1 as DAROLEID from dual union all ) t on (t.DADSNBR = access.DADSNBR and t.DAROLEID = access.DAROLEID) when not matched then insert (DADSNBR, DAROLEID) values (t.DADSNBR, t.DAROLEID)我将查询中的第二个DADSNBR更改为DAROLEID,因为那是我假设的意思,但这并不能解决。 :(

@Maccath-union all将多个select语句(在本示例中为四个,如您的原始问题)组合为一个结果集。您的版本的结尾为union all;在最后一个select子语句之后不应出现。

该脚本太混乱了,您将DADSNBR用作列名和表名两次,然后您的匹配子句将其两次。.令我惊讶的是,即使您对此进行了测试,Oracle甚至都没有抛出错误。最后,您的查询没有回答问题。最后,如果要使用正确的表名作为OP,则此语句仍不会阻止将重复项插入到该表中,而只是从源而不是从目标中删除。

@sksallaj:感谢您指出我的错别字,我已经纠正了。它确实回答了这个问题,因为它可以防止使用单个语句插入重复项。因为如果有行,则MERGE将具有"匹配项",但是由于没有WHEN MATCHED子句,因此将不会发生任何事情。因此,仅将不存在的行插入到目标表中。在这里查看我的示例:sqlfiddle.com/#!4/79c66/3

好吧,我还给你投票:)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python炼丹师是什么_2021年编程语言趋势预测:Python和JavaScript仍火热,Go不可小觑...

编译 | 陈大鑫Tensorflow和Pytorch到底该用哪个呢&#xff1f;“import tensorflow as pytorch!”编程语言及框架似乎总是被人拿来比较&#xff0c;这里我们只谈语言。作为开发人员&#xff0c;在当今这个技术更迭飞快的时代要连年吃香并非易事&#xff0c;很多十年开发经验以上…

python123数值运算_python123中 Hello World的条件输出 和数值运算

描述 获得用户输入的一个整数&#xff0c;参考该整数值&#xff0c;打印输出"Hello World"&#xff0c;要求&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪…

row number函数 oracle,oracle函数 ROW_NUMBER()

【语法】ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)【功能】表示根据COL1分组&#xff0c;在分组内部根据 COL2排序&#xff0c;而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)row_number() 返回的主要是“行”的信息&#xff0c;并没有排名【参数】【说…

perl python json_Perl解析JSON数据精解

简介:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON采用完全独立于语言的文本格式&#xff0c;但是也使用了类似于C语言家族的习惯(包括C, C, C#, Java, JavaScript, Perl,…

python while true_Python天坑系列(一):while 1比while True更快?

更多 0. 前言 前些天被Python的多线程坑了一把&#xff0c;因此产生了写一个《Python天坑系列》博客的想法&#xff0c;说说我碰到的那些Python的坑。 而天坑这个词呢&#xff0c;一方面指Python的坑&#xff0c;另一方面也说明本系列文章也是个坑&#xff0c;对于会写什么内容…

下列不属于PHP开发优势的是,php开发的优势有哪些?

说到PHP&#xff0c;好多刚刚毕业的学生都不是非常了解。这里&#xff0c;达内PHP培训老师跟大家分析一下目前行业中对这个技术方向的需求及发展情况。由于大学学科设置的问题&#xff0c;更多的学生都对C&#xff0c;C&#xff0c;Java等计算机语言比较熟悉&#xff0c;同时也…

苹果sf字体_苹果UI设计的改变意味着什么?

WWDC虽然已经过去了一段时间&#xff0c;虽然没有什么硬件产品&#xff0c;但还是给我们带来了许多新的惊喜。但我们这篇文章不谈技术问题&#xff0c;只谈苹果的UI变化。因为这可能是近10年来苹果第二次颠覆性的升级&#xff0c;上次还是2013年的iOS7的全面扁平化。从设计的层…

python需要配置环境变量吗_python安装和配置环境变量

Python 安装和配置环境变量 一、 Python 的安装&#xff1a; 在网上找一个 python 的安装包&#xff0c;我找的 python3.3.5 。照着安装步骤一步一步进行安装&#xff0c;完 成后&#xff0c;运行 IDLE(Python GUI) &#xff0c;打开的命令行框出现类似如下内容则说明安装成功&…

python的tkinter按钮大小_如何使用python更改tkinter中按钮和帧的字体和大小?

更新&#xff1a;新墨西哥州科技tkinter网站已在GitHub上存档。必须有Tkinter对象才能创建字体from Tkinter import *import tkFontroot Tk()创建一个类似新墨西哥科技网站示例的字体helv36 tkFont.Font(familyHelvetica, size36, weightbold)# you dont have to use Helveti…

linux命令 翻译,(翻译)Linux命令行(一)

这里的Linux命令行系列是翻译自http://www.linuxguide.it/的&#xff0c;如果你英语够好&#xff0c;推荐你去看原版的。这是第一篇&#xff0c;主要介绍关机重启等操作和查看系统信息等操作的命令。关机重启等操作shutdown -h now 关机init 0 …

cuda卸载_Ubuntu18.04英伟达显卡驱动、Cuda安装

一、显卡驱动安装1. 准备工作禁用BIOS中的secure boot&#xff0c;因为此方法使用第三方源安装显卡驱动&#xff0c;不禁止secure boot会导致安装的驱动不能使用&#xff0c;禁用也不会有多大安全隐患。2. 禁用nouveau禁用nouveau&#xff0c;这是ubuntu默认使用的开源显卡驱动…

git两个账号切换_多个git账号之间的切换

$ clip < ~/.ssh/id_rsa.pubbash: /c/Users/UsersName/.ssh/id_rsa.pub: No such file or directoryStep 1、检查本机现有的SSH密钥检查~/.ssh看看是否有名为d_rsa.pub和id_dsa.pub的2个文件。如果你什么都没得到这些文件&#xff0c;转到 步骤2 ;否则&#xff0c;请跳到 …

linux服务器配置试卷,2016年Linux认证模拟练习题及答案

2016年Linux认证模拟练习题及答案1.设计一个shell程序&#xff0c;在每月第一天备份并压缩/etc目录的所有内容&#xff0c;存放在/root/bak目录里&#xff0c;且文件名为如下形式yymmdd_etc&#xff0c;yy为年&#xff0c;mm为月&#xff0c;dd为日。Shell程序fileback存放在/u…

内存条能4+8混插吗?_笔记本内存条双通道提升有多大?实测FORESEE,你知道好处在哪吗...

不知道大家发现了没&#xff0c;最近存储类产品、内存条普遍价格都涨起来了&#xff0c;后悔年前没买内存条给我的暗夜精灵3升升级&#xff0c;至今还插着一根8G的条子&#xff0c;其实日常用也够了。不过&#xff0c;今年打算做做视频&#xff0c;搞搞线上直播&#xff0c;所以…

python计算期望值_机器学习:计算方差时为何除以n-1

小弟准备了数据结构、Java、大数据、AI、面试题、python等各种资料 需要领取等朋友麻烦 转发此文&#xff0c;然后私信【学习】即可获取设样本均值为​&#xff0c;样本方差为​&#xff0c;总体均值为​&#xff0c;总体方差为​&#xff0c;那么样本方差​有如下公式&#xf…

linux rpm版本号,linux中RPM包命名规则

RPM包的一般格式为&#xff1a;name-version-arch.rpmname-version-arch.src.rpm例&#xff1a;httpd-2.2.3-29.el5.i386.rpmhttpd-devel-2.2.3-29.el5.i386.rpmhttpd-manual-2.2.3-29.el5.i386.rpmsystem-config-httpd-1.3.3.3-1.el5.noarch.rpm(1)name&#xff0c;如&#xf…

python十点半游戏代码_Python实现Pig Latin小游戏实例代码

前言&#xff1a; 本文研究的主要是Python实现pig Latin小游戏的简单代码&#xff0c;具体介绍如下。 Pig Latin是一个语言游戏。 步骤&#xff1a; 1.让用户输入一个英文单词 2.确保用户输入一个有效单词 3.将单词转换成Pig Latin 4.显示转换结果 一、Input 函数&#xff1a;r…

查看linux系统的sp,查看linux系统版本命令

一。查看内核版本命令&#xff1a;1) [[email protected]_SYS ~]# cat /proc/versionLinux version 2.6.18-238.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) #1 SMP Sun Dec 19 14:22:44 EST 20102)[[email protected]_SYS ~]# uname -r2.6.18-2…

程序的图标无法改变_安卓微信7.0.7内测版发布,细节更新,小程序功能优化

昨天&#xff0c;微信 7.0.7 for Android 内测版悄然发布&#xff0c;如何参加内测可以咨询本人。按照近来的惯例&#xff0c;安卓的内测版的功能会在随后的更新iOS正式版中体现&#xff0c;并且要先于安卓正式版发布。下面我们就来简单介绍一下本次更新的具体内容。一、「…」…

vue获取input的属性_vuejs 中如何优雅的获取 Input 值

原生 js使用 getElementById 比较麻烦的地方需要为元素设置 id设置 id 之后&#xff0c;无法复用&#xff0c;因为一个页面中不能存在两个相同的 id双向绑定 v-model分两种情况input 默认为空。这种情况使用 v-model 最方便&#xff0c;通过 this.inputName 即可获取到对应的值…