我有一个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:我的例子很简单,以便向您展示实际问题。所以,请不要被这个例子的微不足道所困扰: - )
答案 0 :(得分:0)
我通常不对字符字段使用引号,并且使用不同的分隔符来避免嵌入逗号的困难,例如: '|'将开放式办公室导出到csv时。 然后在导入时指定分隔符并转义反斜杠以指定空E'\\ N'。
答案 1 :(得分:0)
“\ N”是一个可以解释为“新行”命令的值。
尝试使用其他字符,例如“@”。