0 0

定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?谢谢各位大侠!5

定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?谢谢各位大侠!

问题补充:这个操作不是在数据库中哦,是在程序中操作数据库哦,用java操作。
housen1987 写道
考虑一下几种方法:

将源表同步到目标数据库(改成一个临时表)

方法一: 两个表数据量都不大的情况下,使用union关键字去掉重复数据后,把得到的数据重建建一张表,删除以前的表,改名为目标表。
方法二: 数据量稍大,使用minus关键字,获取存在于源表但不存在于目标表的数据,然后将的到的差集一条一条地插进目标表。
方法三: 目标表建立索引,查询出源表当中不存在于目标表的数据(使用exists关键字,不要用in),然后将得到的数据一条条地插入到目标表中。

以上方法,如果是在oracle数据库中,建议使用pl/sql程序完成,速度快!


问题补充:这两个表不是在同一个数据库的,一个在oracle,另一个在sybase,是这种情况,把oracle中的表数据存到sybase表中,在大数据量情况下要考虑性能,定时任务不要读已经拿到的数据,只要拿新增的数据,然后存到sybase中!
housen1987 写道
引用
这个操作不是在数据库中哦,是在程序中操作数据库哦,用java操作。

一样的,程序也操作数据建表,使用pl/sql程序,做集合运算等操作,我说的是大部分操作使用数据库完成,这样能显著提高效率,如果只是用java程序的话,那考虑下面两种方法:

1 源表中的数据一条一条地取出来,对比目标表,实现不重复插入;

2 两个表的数据都取出来,采用内存hash join的方式,得到源表-目标表的差集数据,然后插入到目标表中


问题补充:理解我的问题有点偏差哦,不用比较目标表,我从oracle中取到新增的数据就行了,我打个比喻吧:假设我第一次读取oracle表是要全表读的,设定定时时间为1分钟,一分钟后我又要读oracle中的数据,那么第一次读的数据就不用第二次再读一遍,而是只读这一分钟内有哪些新增的数据,取得新增的数据插入到sybase表中,因为两张表数据一样,取得oracle中的新增数据也是sybase没有的数据,所以不用比较sybase中的数据,直接插入!
housen1987 写道
引用

这两个表不是在同一个数据库的,一个在oracle,另一个在sybase,是这种情况,把oracle中的表数据存到sybase表中,在大数据量情况下要考虑性能,定时任务不要读已经拿到的数据,只要拿新增的数据,然后存到sybase中!


我还想问一个问题,重复数据是oracle表数据有重复,还是oracle表与sybase表的数据有重复?

如果是oracle表数据有重复,这个最好办,oracle的数据查询出来,使用distinct或union select * from dual一下,就能把重复数据去掉了。

如果是oracle表与sybase表的数据有重复,那么在不读取sybase表的情况下,怎么知道oracle表中哪些数据是重复数据呢?


问题补充:这次你应该清楚了我的问题了,很高兴,表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗?
housen1987 写道
引用

理解我的问题有点偏差哦,不用比较目标表,我从oracle中取到新增的数据就行了,我打个比喻吧:假设我第一次读取oracle表是要全表读的,设定定时时间为1分钟,一分钟后我又要读oracle中的数据,那么第一次读的数据就不用第二次再读一遍,而是只读这一分钟内有哪些新增的数据,取得新增的数据插入到sybase表中,因为两张表数据一样,取得oracle中的新增数据也是sybase没有的数据,所以不用比较sybase中的数据,直接插入!


oracle表中增加读取标识位字段,默认为0,已经同步过的,设置标识位为1,下次oracle表再有新数据增加的话,那么只读标识位为0的就可以了。

如果不想破坏oracle表的结构,自己在oracle上新增一个临时表,来存储已经同步过的oracle数据的主键标识也行。


问题补充:嗯,非常感谢您的耐心回答,我现在的情况完全就是你假设的那种,A,B,C三个点进行数据同步,虽然问题还待一步解决,但我还是采纳您的回答!
housen1987 写道
引用

这次你应该清楚了我的问题了,很高兴,表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗?


这个真的是比较困难。

首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口),所以你只能全部取出来,依靠自己的程序去同步数据。

我见过的做法是:

假设用户机是A(Oracle),你的java应用部署在B机器上,sybase数据库在C机器上。

(1)B机器上安装一个内存数据库(有一个开源的H2内存数据库)
(2)获取A(Oracle)的全部数据,如果B机器的内存不大,那么分批获取也可以,与B机器上的内存数据库中的临时储存表Temp做hash join,得到增量数据。
(3)把增量数据同步到B机器的内存数据库和C机器的sybase上。

这里,说明一下,需要同步的表是每隔一段时间会重新建立的,比如天表、月表等,所以一个表不会超级大,达到内存无法消化的地步,所以这个内存数据库的临时表也是有一定的容量的。

可能还有更好的方式,不过,中间表或中间文件记录应该还是要的。

 
2012年1月06日 15:14

5个答案 按时间排序 按投票排序

0 0

采纳的答案

引用

这次你应该清楚了我的问题了,很高兴,表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗?


这个真的是比较困难。

首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口),所以你只能全部取出来,依靠自己的程序去同步数据。

我见过的做法是:

假设用户机是A(Oracle),你的java应用部署在B机器上,sybase数据库在C机器上。

(1)B机器上安装一个内存数据库(有一个开源的H2内存数据库)
(2)获取A(Oracle)的全部数据,如果B机器的内存不大,那么分批获取也可以,与B机器上的内存数据库中的临时储存表Temp做hash join,得到增量数据。
(3)把增量数据同步到B机器的内存数据库和C机器的sybase上。

这里,说明一下,需要同步的表是每隔一段时间会重新建立的,比如天表、月表等,所以一个表不会超级大,达到内存无法消化的地步,所以这个内存数据库的临时表也是有一定的容量的。

可能还有更好的方式,不过,中间表或中间文件记录应该还是要的。

2012年1月06日 20:13
0 0

引用

理解我的问题有点偏差哦,不用比较目标表,我从oracle中取到新增的数据就行了,我打个比喻吧:假设我第一次读取oracle表是要全表读的,设定定时时间为1分钟,一分钟后我又要读oracle中的数据,那么第一次读的数据就不用第二次再读一遍,而是只读这一分钟内有哪些新增的数据,取得新增的数据插入到sybase表中,因为两张表数据一样,取得oracle中的新增数据也是sybase没有的数据,所以不用比较sybase中的数据,直接插入!


oracle表中增加读取标识位字段,默认为0,已经同步过的,设置标识位为1,下次oracle表再有新数据增加的话,那么只读标识位为0的就可以了。

如果不想破坏oracle表的结构,自己在oracle上新增一个临时表,来存储已经同步过的oracle数据的主键标识也行。

2012年1月06日 18:16
0 0

引用

这两个表不是在同一个数据库的,一个在oracle,另一个在sybase,是这种情况,把oracle中的表数据存到sybase表中,在大数据量情况下要考虑性能,定时任务不要读已经拿到的数据,只要拿新增的数据,然后存到sybase中!


我还想问一个问题,重复数据是oracle表数据有重复,还是oracle表与sybase表的数据有重复?

如果是oracle表数据有重复,这个最好办,oracle的数据查询出来,使用distinct或union select * from dual一下,就能把重复数据去掉了。

如果是oracle表与sybase表的数据有重复,那么在不读取sybase表的情况下,怎么知道oracle表中哪些数据是重复数据呢?

2012年1月06日 17:36
0 0

引用
这个操作不是在数据库中哦,是在程序中操作数据库哦,用java操作。

一样的,程序也操作数据建表,使用pl/sql程序,做集合运算等操作,我说的是大部分操作使用数据库完成,这样能显著提高效率,如果只是用java程序的话,那考虑下面两种方法:

1 源表中的数据一条一条地取出来,对比目标表,实现不重复插入;

2 两个表的数据都取出来,采用内存hash join的方式,得到源表-目标表的差集数据,然后插入到目标表中

2012年1月06日 16:21
0 0

考虑一下几种方法:

将源表同步到目标数据库(改成一个临时表)

方法一: 两个表数据量都不大的情况下,使用union关键字去掉重复数据后,把得到的数据重建建一张表,删除以前的表,改名为目标表。
方法二: 数据量稍大,使用minus关键字,获取存在于源表但不存在于目标表的数据,然后将的到的差集一条一条地插进目标表。
方法三: 目标表建立索引,查询出源表当中不存在于目标表的数据(使用exists关键字,不要用in),然后将得到的数据一条条地插入到目标表中。

以上方法,如果是在oracle数据库中,建议使用pl/sql程序完成,速度快!

2012年1月06日 15:27

相关推荐

    从数据库取数据动态生成菜单

    1. **设计数据库模型**:创建一个或多个表来存储菜单信息,如菜单ID、父菜单ID、菜单名、URL、图标、顺序等。此外,还需考虑权限关联,如用户ID、角色ID与菜单ID的关系。 2. **编写后端逻辑**:使用Java、Python、...

    纯真数据库读取程序代码

    "纯真数据库读取程序代码"是一个用于处理和解析纯真IP数据库的C++源代码项目,包含了两个关键文件:SEU_QQwry.cpp和SEU_QQwry.h。这个程序的主要目的是帮助开发者在他们的应用中快速查找并识别IP地址对应的地理位置...

    成语数据大全 38500个成语,mysql数据文件,包含字段[成语,发音,说明,出处,举例,成语故事,声音地址(故事)]

    标题中的“成语数据大全 38500个成语,mysql数据文件,包含字段[成语,发音,说明,出处,举例,成语故事,声音地址(故事)]”指的是一个专门收录了大量成语的数据库,该数据库是用MySQL这种关系型数据库管理系统存储的。...

    空间数据库做的一个小gis系统

    本系统"空间数据库做的一个小GIS系统"利用了ADO(ActiveX Data Objects)技术来连接数据库。ADO是微软提供的一种数据库访问接口,可以方便地在多种数据库系统(如SQL Server)之间进行数据交互。通过ADO,程序可以...

    SQL 数据库大学基础数据查询练习(一)易

    在本篇【SQL数据库大学基础数据查询练习(一)易】中,主要涵盖了数据库查询的基础概念和常用操作,适合初学者进行练习。以下是对这些知识点的详细解释: 1. 列出表的所有字段:在SQL中,使用`SELECT * FROM table_...

    数据结构-双向链表

    双向链表,顾名思义,是一种链式存储结构,其中每个节点包含两个指针,一个指向前一个节点,另一个指向后一个节点。与单向链表相比,双向链表允许双向遍历,即可以从前往后也可以从后往前访问元素,增加了数据操作的...

    Cassandra 分布式数据库详解

    再来看看 `Keyspaces`,这是 Cassandra 中的一个关键概念,类似于传统数据库的表空间。Keyspace 是数据的逻辑分区,可以包含多个 ColumnFamily,后者相当于表。ColumnFamily 的属性如 `ColumnType`(标准列或超列)...

    本地数据库FMDB

    本地数据库FMDB是iOS开发中常用的一个轻量级SQLite数据库管理框架,主要应用于小型数据存储需求,例如用户偏好设置、应用状态记录等。FMDB基于C语言的SQLite库,但提供了Objective-C的封装,使得在iOS应用中操作...

    鼎捷易飞9.0数据库表结构

    鼎捷易飞9.0数据库表结构,数据字典。二次开发文档

    MR程序Bulkload数据到hbase

    MapReduce是Apache Hadoop框架中的一个关键组件,用于处理和生成大规模数据集。而HBase是一个分布式的、支持列族的NoSQL数据库,适合实时读写操作。 在大数据领域,当需要将大量数据导入到HBase时,直接通过客户端...

    DXBBS大侠论坛 v8.1 ACCESS

    DXBBS大侠论坛 v8.1 ACCESS是一款基于Access数据库的论坛系统,它以其便捷的维护性和相对简单的操作性在IT行业中受到了一定的关注。这款论坛软件的特色在于,用户在下载后无需进行复杂的配置工作,即可直接投入运行...

    C#的数据库辅助类,DBHelper类

    在处理数据库操作时,为了简化代码和提高可维护性,开发者通常会创建一个数据库辅助类,如`DBHelper`。这个类封装了数据库连接、查询、事务处理等常见操作,使得业务逻辑代码能够更加专注于业务本身,而不是数据库...

    BBS大侠论坛ACCESS_C#论坛社区程序.rar

    【标题】"BBS大侠论坛ACCESS_C#论坛社区程序.rar" 涉及到的知识点主要集中在两个方面:一是数据库管理系统Access,二是编程语言C#,以及它们在构建论坛社区程序中的应用。 首先,Access是一款由Microsoft开发的关系...

    C#资源\数据集内容比较

    在C#编程中,数据集(DataSet)是一个非常重要的组件,它是.NET框架中用于处理关系型数据的核心类。数据集提供了在内存中管理和操作数据的能力,可以用来存储、查询和更新来自不同数据源的数据。本资源主要探讨的是...

    mysql数据库常用命令

    ` 创建一个名为`name`的数据库。 2. **选择数据库**: `USE`命令用于切换到已存在的数据库,如`USE databasename;`将当前工作环境切换到`databasename`数据库。 3. **删除数据库**: `DROP DATABASE`命令直接...

    sqlite数据库

    5. **文件存储**:SQLite将数据库作为一个单一的文件存储,便于备份和共享。 6. **高性能**:优化的查询执行器和高效的索引机制使得SQLite在处理大量数据时表现出色。 7. **安全性**:通过权限控制和加密功能,可以...

    读取数据库

    它允许在一个文件中存储整个数据库,非常适合资源有限的环境。在Python编程中,我们可以使用SQLite3模块来与SQLite数据库进行交互。 1. 安装SQLite3模块: 在Python环境中,SQLite3模块通常已经内置,无需额外安装...

    时态数据库timedb2.0教学资料

    时态数据库是一种特殊的数据库系统,它能够存储和处理时间相关的数据,记录数据随时间变化的历史状态。Timedb2.0是这样一个专为处理时态数据而设计的软件,它构建在J2EE(Java 2 Platform, Enterprise Edition)平台...

    基于SQL Server数据库版的局域网聊天系统

    【标题】"基于SQL Server数据库版的局域网聊天系统"揭示了这是一个利用SQL Server作为后台数据存储,设计用于局域网内的聊天应用程序。在局域网环境下,用户可以通过这样的系统实现实时通信,共享信息,提升协作效率...

    oracle数据库产品与发展史.pptx

    Oracle数据库还提供了众多常用选件来增强其功能,例如Oracle RAC提供高可用性,ASM(Automatic Storage Management)简化了存储管理,数据分区(partitioning)优化了大型数据集的处理,Data Guard提供了灾难恢复...

Global site tag (gtag.js) - Google Analytics