将表从一个数据库复制到另一个

Posted

技术标签:

【中文标题】将表从一个数据库复制到另一个【英文标题】:copying a table from one database to another 【发布时间】:2009-02-04 13:20:09 【问题描述】:

我正在尝试将我的一些表存档到同一服务器上的另一个数据库中。但是 INSERT INTO...SELECT...FROM 在构建时给了我一个错误(SQLSTATE = 42704)。该表存在于第二个数据库中。 有人能帮忙吗?

【问题讨论】:

您好,请您发布完整的 SQL 代码。您在使用 DB2 吗? 嗨 John 请看下面我的 SQL,其中 lqifcold=数据库名称,ls2user=schema INSERT INTO LQIFCOLD.LS2USER.TIN_TRIGGER_OUT (fld1...) (SELECT flds... FROM LS2DB001.LS2USER.TIN_TRIGGER_OUT ) ...是的,我正在使用 db2。谢谢约翰安妮塔 【参考方案1】:

从您的问题中不清楚正在使用哪个版本的 DB2。我假设它是 Linux、Unix 和 Windows 版本。您似乎正在使用联合来链接两个数据库。

您的查询的 SELECT 部分是否从 LS2DB001 工作?值得尝试确定您遇到问题的数据库。

假设问题出在 LS2DB001 上,如果您定义了联合链接的用户对查询中的基表具有权限,则还要检查他们是否对系统目录表具有权限。如果不是,他们将无法解析和验证您是否可以运行查询。

【讨论】:

顺便说一句,是的,这种操作可以而且应该有效,它应该只是确定错误所在的问题。 嗨,马克,感谢您的意见。我已经尝试在两个数据库中使用这个 sql 构建存储过程。在 LQIFCOLD (TO db) 中,我得到 SQLSTATE=42704 未定义名称 LS2DB001.LS2USER.TIN_TRIGGER_OUT。在 LS2DB001 (FROM db) 中,我得到 SQLSTATE=42703 LQIFCOLD.LS2USER.TIN_TRIGGER_OUT 在使用的​​上下文中无效。【参考方案2】:

我们已经破解了!如果使用以下脚本,则它可以工作。 LOAD 无需在复制的批次之间进行 COMMIT 即可工作。 ('Transaction Log full...'错误问题也解决了)

连接到 LS2DB001; 导出到 IXF 的“C:\temp\TIN_TRIGGER_OUT.IXF” 消息“C:\temp\TIN_TRIGGER_OUT.EXM” 选择 * 从 LS2USER.TIN_TRIGGER_OUT; 连接复位; 连接到 LQIFCOLD; 从 IXF 的“C:\temp\TIN_TRIGGER_OUT.IXF”加载 消息“C:\temp\TIN_TRIGGER_OUT.IMM” 插入到 LS2USER.TIN_TRIGGER_OUT 复制无索引模式自动选择; 犯罪; 连接重置;

【讨论】:

【参考方案3】:

我在http://www.connx.com/products/connx/Connx%208.6%20UserGuide/CONNXCDD32D/DB2_SQL_States.htm 上找到了这个: 42704 未定义的对象或约束名称。修改 SQL 语法并重试。

如需更多帮助,请尝试更具体,例如粘贴完整的 sql 语句、表方案等。

【讨论】:

您好 Tehvan 谢谢,但我已经修改了各个方面的语法......运气不好。 请看我下面的 SQL,其中 lqifcold=数据库名称,ls2user=schema INSERT INTO LQIFCOLD.LS2USER.TIN_TRIGGER_OUT (fld1...) (SELECT flds... FROM LS2DB001.LS2USER.TIN_TRIGGER_OUT ) 【参考方案4】:

你可以的

 Select 'insert into tblxxxx (blabla,blabal) values(' + fld1 + ',' + fld2 + ',' ...... + ')'

From tblxxxxxx

将结果复制为文本脚本并在另一个数据库中执行。

【讨论】:

【参考方案5】:

最好的方法是创建一个自定义脚本。根据表的大小(有多少记录),您可以选择所有数据到内存中,然后翻转它们,将它们插入到您首先创建的表的副本中,或者您可以将数据导出为一个 csv 文件或其他一些基于文本的文件,然后将其翻转以将数据插入到另一个表中。

如果您还没有某种正式的备份程序可以做到这一点,那么这将是您最好的选择。

注意:一些 db2 数据库,例如 iSeries 上的那些,实际上并没有“数据库”,它们有库。使用正确的用户配置文件,您可以同时访问两个库,将它们中的表连接在一起或进行

create table library/newFilename as 
(select * from originallibrary/originalfilename) with data

但这仅适用于我相信的 iSeries。

【讨论】:

嗨瑞恩感谢您的帮助。但是,该表包含大约 100 万行。由于在它们之间提交数据的限制,导入/导出在此方面效果不佳。还有其他建议吗?安妮塔【参考方案6】:

我正在写这个回复作为另一个答案,所以我有更多的空间。

我只能建议将这些步骤分解为它们的组件,并仔细检查错误发生在哪里。同样,我假设您使用的是联合:

a) 在您的 FROM 数据库中,以您用于联合链接的用户身份连接,您的选择是否有效?

b) 在您的 TO db 中,使用链接,选择是否有效?

c) 在您的 TO db 中,通过存储过程使用链接,选择是否有效?

d) 在您的 TO db 中,使用 INSERT...values(x,y,z),您可以插入到表中吗?

e) 在您的 TO db 中,通过存储过程,使用 INSERT...values(x,y,z),您可以插入吗?

如果没有更多信息,这是我能建议的最佳攻击路线。

【讨论】:

嗨,马克,再次感谢您的意见。我没有使用联合数据库。我们有一个非常基本的 DB2 设置和非常基本的工具来帮助编码。跨数据库处理只能使用联合数据库吗? 如果是这样,如果我只更改“TO”数据库会有什么影响?最后,我该如何做出这种改变?抱歉,我对 DB2 完全陌生。谢谢 如果您需要更多信息,请告诉我,我会发送给您。谢谢 嗨安妮塔。显然,我对你在做什么的假设走错了路。为了进一步提供帮助,您将不得不更详细地说明您在做什么。例如你是如何连接到数据库的,以及你的代码是如何工作的。 对不起马克,也许我没有解释清楚这个问题。练习的目的是将数据从 DB1 中的 TBL1 复制到 DB2 中的 TBL2。在我的项目中,我定义了两个数据库并授予了适当的身份验证。

以上是关于将表从一个数据库复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

将表从一个数据库复制到另一个数据库

将表从一个数据库复制到另一个数据库的最简单方法?

将表从一个数据库复制到另一个数据库的最简单方法?

将表从一个数据库复制到另一个数据库的最简单方法?

将表从一个数据库复制到另一个数据库的最简单方法?

将表从一个数据库复制到另一个数据库的最简单方法?