使用外部文件作为表格是快速将大量数据导入 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 文档团队。