带约束的Psql COPY失败

时间:2017-10-27 14:25:03

标签: postgresql psql

我在服务器上有这样的表:

CREATE TABLE example_table (
id                          BIGSERIAL PRIMARY KEY,
name                        VARCHAR(70) NOT NULL,
status                      VARCHAR(70) NOT NULL CONSTRAINT status_enum CHECK (status IN ('old', 'new')),
UNIQUE (id, name)
);

我有一个SQL文件example.sql。第一行包含标题:

name_of_class,status
'CLASSNAME','old';

我尝试将psql \ copy运行到google服务器:

PGPASSWORD=password psql -d database --username username --port 5432 --host 11.111.111 << EOF
    BEGIN;
    \copy example_table(name,status) FROM example.sql DELIMITER ',' CSV Header
    COMMIT;
EOF

然后我收到此错误:

ERROR:  new row for relation "example_table" violates check constraint "status_enum"
DETAIL:  Failing row contains (1, 'CLASSNAME', 'old';).
CONTEXT:  COPY example_table, line 2: "'CLASSNAME','old';"
ROLLBACK

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您的源csv似乎正在使用'(单引号)来引用所有列。您可以使用选项QUOTE

将其指定为引号字符

\copy命令正在尝试将'old'加载到状态列中,以检查值是new还是old。额外的引号违反了约束条件。

\copy example_table(name,status) FROM example.sql DELIMITER ',' CSV Header QUOTE ''''

需要4个单引号,因为1指定实际的引号char,1指定转义引号字符,2包含转义的引号字符。