【发布时间】:2011-06-29 02:22:24
【问题描述】:
我有一个 CSV 文件,想通过我的数据库中的 Postgres 命令“COPY x FROM y”将其导入。该数据库有两列:名为“id”的列(串行,不允许 NULL)和“值”列(varchar,允许 NULL 并应用约束)。我将在下面为测试数据库提供简短的创建脚本。 CSV 是通过从 OpenOffice 电子表格中导出来获得的。最后还提供了 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 值的列。
我真的需要使用 Copy 命令来完成,因为我想通过使用脚本来自动化导入过程。当使用 phpPGAdmin 导入 CSV 时,一切正常。这是因为 phpPgAdmin 正在向 postgres 服务器发送 INSERT-Commands。所以显然没有使用“copy from”-命令...
其他信息:
这是数据库的创建脚本:
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:我的例子是为了向你展示实际的问题。所以,请不要被这个例子的琐碎所困扰:-)
【问题讨论】:
标签: database file postgresql csv import