У меня есть файл CSV, и я хочу импортировать его с помощью команды Postgres «COPY x FROM y» в моей базе данных. Эта база данных имеет два столбца: столбец с именем «id» (последовательный, NULL не разрешен) и столбец «value» (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 есть некоторые проблемы с пониманием того, что "\ N" в моем CSV-файле должно быть значением NULL (что фактически разрешено в этом столбце). Во-первых, он проверяет всю строку "\ N" на соответствие ограничению. Так как он не соответствует RegexPattern, определенному в ограничении, он выдаст ошибку, указанную выше. Я попробовал несколько модификаций моей команды COPY-FROM, но ни одна из них не привела к успешному импорту.
Вкратце: Мне нужно решение, позволяющее Postgres мне импортировать csv через команду copy-from-command и, более того, иметь возможность иметь \ N-записи в столбцах string / varchar. представляющие NULL-значения.
Мне действительно нужно сделать это с помощью команды Копировать, потому что я хочу автоматизировать процесс импорта с помощью сценария. При использовании phpPGAdmin для импорта CSV все работает нормально. Это связано с тем, что phpPgAdmin отправляет команды INSERT на сервер postgres. Так что, очевидно, не используется команда «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;
Заранее большое спасибо!
Ура,
Philipp
PS: Мой пример сводится к тому, чтобы показать вам реальную проблему. Поэтому, пожалуйста, не беспокойтесь о тривиальности этого примера: -)