【问题标题】:Firebird External Tables火鸟外部表
【发布时间】:2014-10-20 16:02:42
【问题描述】:

我正在尝试找到一种将大量数据快速加载到数据库中的方法,并且有人建议使用 Firebird 外部表,我想了解有关此方法的更多信息,我尝试过在线搜索,但我没有得到关于这方面的有用信息,我想知道它们是如何工作的?表必须完全相同吗?如果您从多个数据库加载数据怎么办?

【问题讨论】:

  • 你想从哪里加载这些数据?您是从另一个数据库转移它吗?
  • 是的,我正在从一个表中加载数据并将其插入到另一个数据库中的另一个表中
  • 您可以将数据从源保存到外部表,并从另一个数据库加载。或者您可以使用外部程序,例如。 Database Workbench 具有“数据泵”功能。

标签: sql delphi firebird data-import


【解决方案1】:

像这样使用外部表:

CREATE TABLE ext1 EXTERNAL 'c:\myfile.txt'
(
field1 char(20),
field2 smallint
);

要快速导入常规表,请执行以下操作:

INSERT INTO realtable1 (field1, field2)
SELECT field1, field2 FROM ext1;

记得在加载之前禁用触发器和索引(如果可能),然后重新激活它们。

此信息来自 Firebird 常见问题解答:http://www.firebirdfaq.org/faq209/

这里有更多关于使用外部表的信息,包括关于文件格式的信息:http://www.delphiman.de/Bin/UsingExternalFilesAsTables.pdf

【讨论】:

  • @Fero68 不,你不需要(Firebird 可以像从普通表中选择一样进行转换),但你必须注意外部文件表的格式非常具体;从技术上讲,它是二进制格式,而不是文本格式(!)。
  • 配置文件更改后是否重启了 Firebird?
  • @Fero68:我认为您只需要修复服务器 C:\Temp\ 上的权限即可允许 Firebird 访问。
  • @Fero68:我使用在 Windows 上运行的本地 FB 服务器对此进行了测试。我创建了外部表并尝试在其中插入行并得到与您相同的错误。我进入我的 Firebird.conf 并注意到我的 ExternalFileAccess = None。问题是我的文件看起来像这样... #ExternalFileAccess = None 我不仅需要将 None 更改为 Full,还需要从行的开头删除“#”。 '#' 将该行视为注释。 ExternalFileAccess = Full 一旦我这样做并重新启动服务,它现在就可以工作了。
  • @Ed Mendez,谢谢,我只需要从行首删除 '#'。
【解决方案2】:

使用外部文件作为表格是快速将大量数据导入 Firebird 的好方法。但是,由于在表定义中使用了 smallint,来自 Firebird FAQs 的示例在我看来要么是不必要的复杂,要么是不正确的。正如FB 2.5 documentation points out,“在大多数情况下,只有 CHAR 类型的列才有用。”

外部文件必须是固定长度记录的文本文件(因此 .csv 文件不起作用)。然后,外部表 def 应使用大小与每条记录中的字段长度匹配的 CHAR 字段。

文本文件中记录长度的任何变化都会导致痛苦(来自痛苦的经历)。我想如果所有的小整数都是相同的位数,那么这个例子可能会起作用,但更一般地说,如果其他格式(日期、数字)在文本文件中通过空格填充简单地表示为 CHAR,事情会更顺利。

例如,如果原始数据如下所示:

Canada 37855702
Central African Republic 4829764
Chad 16425859
Chile 19116209
China 1404676330

那么文本文件应该是这样的:

Canada                     37855702
Central African Republic    4829764
Chad                       16425859
Chile                      19116209
China                    1404676330

国家/地区右填充为 25 个字符,(大)整数左填充为 10 个字符,因此记录为 35 个字符,加上一个用于换行 (*nix) 或两个用于 Window 的 CRLF。 (请注意,如果文件使用 Unicode 编码,事情会变得更加复杂。)

表格定义如下:

CREATE TABLE ext_test EXTERNAL '/home/dave/fbtest.txt'
(
COUNTRY CHAR(25),
POPULATION CHAR(10),
LF CHAR(1)
);

确保文件与 FB 服务器进程位于同一文件系统上,服务器进程有权访问该文件(可能通过 FB 组),并且 firebird.conf 中的 ExternalFileAccess 参数设置正确 - 请参阅有关详细信息,请参阅 2.5 文档。

使用外部表可以做一些有限的事情,但它作为临时传输表最有用,作为最终 FB 表的来源。将外部表中的每一行插入最终目标,将 CHAR 字段转换为适当的数据类型。对于任何实际数量的数据,该过程的运行速度比单独读取和馈送每一行的 Python 代码要快得多。

如果您使用的是旧版本的 FB,请不要忘记在完成后删除外部表以释放文件锁,如常见问题解答中所述。较新的版本会自动执行此操作。上面链接中的 2.5 文档中有更多关于外部表的内容。

PS - 我已将以上内容通过电子邮件发送给 Firebird 文档团队。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2011-10-23
    相关资源
    最近更新 更多