Firebird外部表

时间:2014-08-27 07:07:08

标签: sql delphi firebird data-import

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

2 个答案:

答案 0 :(得分:6)

使用这样的外部表:

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

答案 1 :(得分:0)

使用外部文件作为表是一种快速将大量数据导入Firebird的好方法。但是,由于在表定义中使用smallint,因此在Firebird常见问题解答中得出的示例似乎不必要地复杂或不正确。正如FB 2.5 documentation points out一样,“在大多数情况下,只有CHAR类型的列才有用。”

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

文本文件中记录长度的任何变化都将导致痛苦(来自痛苦的经历)。我想如果所有smallint都是相同的位数,则该示例可能会起作用,但更一般而言,如果在文本文件中通过用空格填充将其他格式(日期,数字)简单地表示为CHAR,则情况会更加顺利。 / p>

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

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编码,情况会变得更加复杂。)

表def看起来像这样:

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的旧版本,请不要忘记在完成外部表的操作后将其释放以释放文件锁,如FAQ中所述。较新的版本会自动执行此操作。上面的链接中的2.5文档中有关于外部表的更多内容。

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