向数据库里插入大量数据,怎么实现不插入重复的记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向数据库里插入大量数据,怎么实现不插入重复的记录相关的知识,希望对你有一定的参考价值。

我每次都要向数据库插入大量的数据,可能每次都有好几万条。

可是这些记录在数据库里有些存在有些不存在,

如果该记录存在再插入肯定会有冲突(数据库和程序会报错)。

有没有什么好的方法实现插入记录的时候发现有重复记录就“更新”,要不就跳过!

请教各位了!!!!!

我给你提供个思路,不要光从sql角度考虑,从java语言提供的异常机智考虑会更简单.因为我在对数据库进行轮询的时候也经常遇到这样的问题.
最好的解决之道就是如果不存在就插入,如果重复,就跳过.
//将插入语句放在循环体中
for(int i=0;i<n;i++)
try
//............省略具体插入代码
//插入的代码块,如果插入异常,将会发生异常 ,并被catch捕捉,但程序不做任何处理.继续循环下面一条!!所有不存在的数据将会被正常插入.所有插入异常将会被忽略!
catch(Exception e)



---这个解决之道就是正常则插入,异常则跳过,满足了你的要求的.呵呵,就是你想要的答案吧.
参考技术A 像这种比较复杂的带逻辑的最好用存储过程做

create procedure altertable
@col1 varchar(20)
,@col2 datetime
,@col3 varchar(255)
......
--所有要插入的字段类型也最好和表一样,假设通过col1 col2就能判断重复
AS
declare @exec_temp int
set @exec_temp=exec ('select count(*) from 表名 where 字段1=@col1 and 字段2=@col2')
--如果col1 col2还不能判断就加col3 col4...

IF (@exec_temp > 0)
begin
--什么都不做,或者exec('update set..')
end
else
begin
exec('insert into 表 values(@col1,@col2.....)')
end
参考技术B 比如有个索引id

插入的时候可以这样

insert into 表
where id not in(select id from 表)

找出id不在表中的数据插入,OK?
参考技术C 给ES插入数据之前,每条数据加一列唯一索引,指定这个索引作为ES每个document的_id,直接插入,如果有重复数据会更新。 参考技术D 将其中一个或几个字段建一个索引,设置索引唯一,并且忽略重复项,这样就可以了

C# 无法向Oracle数据库插入数据

如题,我在C#里执行一段向Oracle数据库插入数据的代码,在程序里调试没出现错误,但是在PL/SQL Developer 可视化界面中,却无法显示该数据这是什么原因啊,跟用户权限有关吗?我在PL/SQL Developer 设置该用户权取为dba,系统权限添加很多条,包括select any table,insert any table等等,但还是不成,这个问题应该怎么解决啊?

(看能不能帮到你,来自CSDN的引用)注意:先用单步调试,找出出错程序语句
<1>未注册XXX动态链接库
(未注册动态链接库文件或者该方法所在的类库不存在)

<2>未将对象设置引用到对象实例
(没有给对象正确赋值,可检查参数值,引用了未初始化的变量)

<3> “myDelegate”是不明确的引用
(同等级别的名字空间节点上出现同名委托)

<4>不支持并行的事务
(新事务未提交或者事务执行不完整,注意,如果提交事务之前存在return语句,那么必须将事务提交放在return之前执行)

<5>ORA: 找不到预期的FROM关键字
(SQL语句中关键字冲突)
(From前面字符未保留空格)

<6>字符串格式不匹配
(Oracle中整数类型参数应用程序中可用字符串代替,但Varchar类型参数在应用程序中必须对应为字符串类型)
(参数转换不正确,参数类型与数据表种字段类型不匹配)

<7>缺少表达式/未找到预期的关键字FROM
(SQL语句错误)
(可用快速监视的方法查看变量的执行情况)
(Oracle中不能用AS关键字给表别名,可去掉AS)
(转换错误,例如char应为to_char,详情请参阅相关Oracle技术资料)

<7>SQL命令未正确结束
(缺少括号或其他标示符)

<8>CURRENT TIMESTAMP
(1)改为:CURRENT_TIMESTAMP,即可
(2)表别名只需: select * from tableName A 即可,不能写成: select * from tablename AS A
(3)to_char(char), to_number(int), to_date(date)

<9>dual 代替 IDM DB2中的SYSIBM.SYSDUMMY1, 用to_date代替timestamp
为组合框指定数据源的时候,要把数据源放在前面,例如 cmb.DataSource = datasource; cmb.DisplayNumber = ...
<10>调用存储过程时出错,参数个数或者类型错误
(检查参数名称、值、类型、长度、传出方向是否和存储过程参数一致,须仔细检查,不然可能一处出错,全盘皆错。鄙人曾经碰到过一次,36个参数要传入存储过程,只因为一个参数名出错,结果系统老提示以上异常 。

<11>执行存储过程中,插入的列过大!
(参数长度太小,或者被引用的字符串没有去掉空格)
<12>给CURRENT_TIMESTAMP 加上N个小时
select CURRENT_TIMESTAMP + N/24 from dual

<12>给组合框指定数据源,所有属性都正常,但是就是无法正常显示!

详见:一个罕见C#异常的解决过程
<13>缺乏应有的引用和程序集,奇怪,我明明添加了呀?
(1)系统内部错误,关掉开发环境,重启动即可!
(2)引用名发生大小写错误!

<14>"Control"是不明确的引用
(1)在系统感知的名字空间下,出现名字相同的类。比如:System.Windows.Forms.TextBox, MyTest.TextBox
(2)详细指定名字空间全称即可,不能以TextBox引用,因为系统不知道你要引用的是哪个TextBox

<15>日期格式图片在转换整个输入字符串之前结束
(1)这通常因为程序中的诸如此类的语句:cast(djrq as char(10))||'' ''||cast(djsj as char(10))
(2)应改为: to_date(to_char(djrq,'yyyy-mm-dd')||' '||to_char(djsj,'hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')

<16>无法处理的服务名
(1)这通常是因为连接字符串错误,或者应用程序所在的文件夹名称错误,导致无法登录Oracle服务器。
例如如果文件夹命名为aaa(dd)等诸如此类含有非字母和数字组合的名称就会因发此异常,特别注意。

<17>OCI:20053 溢出错误
(1)这通常是因为数值类型的小数位太长,导致Adapter的Fill()方法抛出异常。解决办法是使用Round函数,限制其小数位长度,例如Round(1/6, 3),把小数位长度限制在3位。

<18>数值超出了范围
(1)这通常出现在数据转换中,转换设置的长度小于数值本身的长度,导致Adapter的Fill()方法抛出异常。解决办法是,例如转换字符串,可写为Cast( Variable as Varchar( 100 ) ),把设置的长度尽可能的超过原变量长度。

<17>OCI: 数字或值错误
(1)你检查之后通常会发现语句本身好像没错误,单独将代码段摘出来执行也没有问题,但是放在存储过程里就是不行。这是Oracle系列产品的一个缺陷,需要将Left Join 和 Union All 改写为其他方式就可以。
参考技术A 如果该用户有DBA权限就肯定能插入数据。你看看oracle报的什么错误(ORA-),或者把你的insert语句发出来。 参考技术B 在可视化界面上面 你提交事务了没?。。。没有提交事务的 新加进的数据是看不到的 参考技术C 很有可能是没有commit 参考技术D 你怎么也用oracle?

以上是关于向数据库里插入大量数据,怎么实现不插入重复的记录的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中,向MYSQL插入多条数据,如何判断如果某记录已经存在就不插入

JAVA里怎么向一个已经满的数组,插入数据!

#导入Word文档图片#值得收藏:当向数据库导入大量数据时,mysql主键唯一键重复插入,如何丝滑操作并不导入重复数据呢

需要使用实体框架将大量记录插入数据库

MySql批量插入时,如何不插入重复的数据

c#实现几种数据库的大数据批量插入