【问题标题】:Copy data between tables in different databases without PK's ( like synchronizing )在没有PK的情况下在不同数据库中的表之间复制数据(如同步)
【发布时间】:2010-11-22 10:46:30
【问题描述】:

我在一个没有 PK 的数据库中有一个表 ( A ),它有大约 30 万条记录。

我在其他数据库中有该表的子集副本 ( B ),它只有 50k 并且包含给定时间范围的备份(七月数据)。

我想从表 B 中将丢失的记录复制到表 A 中,当然不复制现有记录。 (我可以创建一个数据库链接让事情变得更简单)

我可以遵循什么策略来成功地将 B 中缺少的行插入 A。

这些是表格列:

IDLETIME    NUMBER  
ACTIVITY    NUMBER      
ROLE    NUMBER          
DURATION    NUMBER      
FINISHDATE  DATE    
USERID  NUMBER
.. 40 extra varchar columns here ... 

我最担心的是缺乏PK。我可以使用所有列创建哈希或 PK 之类的东西吗?

在这种情况下有什么可能的处理方式?

我在表 A 中使用 Oracle 9i,在 B 中使用 Oracle XE ( 10 )

要复制的大约元素数是 20,000

提前致谢。

【问题讨论】:

  • 表A中的行是否有唯一性约束?

标签: sql oracle backup data-recovery


【解决方案1】:

如果数据量足够小,我会选择以下

CREATE DATABASE LINK A CONNECT TO ... IDENTIFIED BY ... USING ....;
INSERT INTO COPY
SELECT * FROM table@A
MINUS
SELECT * FROM COPY;

您说要复制大约 20,000 个,但不是整个数据集中有多少。 另一种选择是删除副本的当前内容并插入原始表的全部内容。

如果完整数据集很大,您可以使用hash,但我怀疑它仍会尝试将整个数据集拖过数据库链接以在本地数据库中应用哈希。

【讨论】:

  • +1 数据约为 300k。我尝试了减号运算符,但我得到了:错误:ORA-12704:字符集不匹配我猜这是因为它们是不同的安装或其他东西。
  • 嗯,我知道我无法仅从数字和日期列中获取该错误消息。原来我还有十几列:(
【解决方案2】:

只要表中不存在重复行,您就可以对所有列应用唯一键或主键。如果键/索引的开销需要维护太多,您还可以在应用程序中查询数据库以查看它是否存在,并且仅在不存在时执行插入

【讨论】:

  • "...您还可以在应用程序中查询数据库以查看它是否存在,并且仅在不存在时才执行插入..." 是的,但是.. 怎么样?关于第一个选项我没有创建 PK 的权限
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多