通过COPY FROM导入CSV不适用于包含的NULL值

时间:2011-02-17 13:10:40

标签: database file postgresql csv import

我有一个CSV文件,想通过我的数据库中的Postgres命令“COPY x FROM y”导入它。此数据库有两列:名为“id”的列(不允许使用serial,NULL)和“value”列(varchar,允许使用NULL并应用约束)。我将在下面为测试数据库提供简短的创建脚本。 通过从OpenOffice电子表格导出CSV来获取CSV。最后还提供了CSV内容。

我的问题:

执行以下命令时......

COPY mytable FROM '/tmp/testdata.csv' CSV HEADER NULL AS E'\N';

...我收到此错误消息:

ERROR:  value for domain car_manufacturer violates check constraint "car_manufacturer_format"
CONTEXT:  COPY mytable, line 3, column value: "\N"

********** Error **********

ERROR: value for domain car_manufacturer violates check constraint "car_manufacturer_format"
SQL state: 23514
Context: COPY mytable, line 3, column value: "\N"

以下是 CSV 文件的内容(直接从OpenOffice导出,因此应符合标准):

"ID","value"
1,"Mercedes"
2,"\N"

显然,Postgres在理解我的CSV文件中的“\ N”是一个NULL值(这个列中实际允许的)时遇到了一些问题。首先,它是根据约束检查整个字符串“\ N”。由于它不符合约束中定义的RegexPattern,因此它将提供上述错误。我尝试了几次COPY-FROM-Command的修改,但这些都没有导致导入成功。

简而言之:我需要一个解决方案,允许Postgres通过copy-from-command导入csv,而且,允许在string / varchar中输入“\ N” - 条目表示NULL值的列。

我真的需要使用“复制”命令来执行此操作,因为我希望使用脚本自动执行导入过程。使用phpPGAdmin导入CSV时一切正常。这是因为phpPgAdmin正在向postgres服务器发送INSERT-Commands。所以它显然没有使用“copy from”-command ...

其他信息:

以下是数据库的创建脚本

CREATE DOMAIN car_manufacturer AS VARCHAR (100) CONSTRAINT car_manufacturer_format CHECK
(VALUE SIMILAR TO '[A-Z][A-Za-z]+|');
COMMENT ON DOMAIN car_manufacturer IS 'The name of a car manufacturer (e.g, Ford, BMW, Chrysler, Mercedes etc.)';

CREATE TABLE mytable
(
  "ID" serial NOT NULL,
  "value" car_manufacturer,
  CONSTRAINT pk_mytable PRIMARY KEY ("ID")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE mytable OWNER TO postgres;

提前多多感谢!

干杯, 菲利普

PS:我的例子很简单,以便向您展示实际问题。所以,请不要被这个例子的微不足道所困扰: - )

2 个答案:

答案 0 :(得分:0)

我通常不对字符字段使用引号,并且使用不同的分隔符来避免嵌入逗号的困难,例如: '|'将开放式办公室导出到csv时。 然后在导入时指定分隔符并转义反斜杠以指定空E'\\ N'。

答案 1 :(得分:0)

“\ N”是一个可以解释为“新行”命令的值。

尝试使用其他字符,例如“@”。