我有一些文本文件。我无法将其导入PostgreSQL表,因为我的某些列具有NULL值。我的表的列的类型为integer
、bigint
和double precision
。
如果所有列的数据类型都是character varying
,则导入效果良好。当使用上述数据类型时,我会得到一个错误。
样品台
create table if not exists test
(
col1 character varying,
col2 bigint default 0,
col3 integer default 0,
col4 double precision default 0.0,
col5 double precision default 0.0,
col6 character varying,
col7 character varying)
示例文本文件:
1234||||0.0566|ab3|
1234||||0.0566|ab3|
1234||2||0.0566|ab3|
1234|9465662698|||0.0566|ab3|
这是我正在使用的命令:
copy test.test1 (col1, col2, col3, col4, col5, col6, col7) FROM '/home/tanzir/Documents/test' DELIMITER '|'
我得到一个错误,比如:
ERROR: invalid input syntax for type bigint: ""
CONTEXT: COPY test1, line 1, column col2: ""
请帮我怎么解决?
对于csv文件,以下命令应足以满足
COPY public.test (col1, col2, col3, col4, col5, col6, col7)
FROM '/home/tanzir/Documents/test' WITH(FORMAT CSV, DELIMITER '|');
对于文本文件,请使用以下命令
COPY public.test (col1, col2, col3, col4, col5, col6, col7)
FROM '/home/tanzir/Documents/test' WITH(FORMAT TEXT, DELIMITER '|', NULL '');
这种行为的原因如下:
NULL:指定表示NULL值的字符串。默认值为文本格式的\N(反斜杠-N(,CSV格式的无引号空字符串。对于不想区分null和空字符串的情况,您可能更喜欢空字符串,即使是文本格式。使用二进制格式时不允许使用此选项。
来源:https://www.postgresql.org/docs/current/sql-copy.html
ps:因为你没有定义FORMAT
,所以它使用默认的TEXT
问题是为COPY
指定了默认的text
格式,其中NULL值由N
表示。选择csv
格式:
COPY test.test1 FROM ... (FORMAT 'csv', DELIMITER '|');