Принимая это определение таблицы:
CREATE TABLE pos (
id serial PRIMARY KEY
, file_id int
, mch bool
, c1 text
, c2 text
, c3 text
, c4 numeric
, c5 text
);
Руководство по COPY
:
Столбцы таблицы не указаны в списке столбцов COPY FROM
получит значения по умолчанию.
Вы уже видите этот эффект для id
, где назначено значение по умолчанию. Оставшиеся столбцы для работы: mch
и file_id
:
mch
всегда ложно, на момент вставки
Make это так, навсегда:
ALTER TABLE pos ALTER mc SET DEFAULT false;
Необходимые привилегии : Вы должны владеть столом или быть суперпользователем, чтобы использовать ALTER TABLE
.
file_id
является константой для файла, который я хочу вставить в эту таблицу, хотя варьируется между файлами. Это известно до того, как я попытаюсь массово добавить файл.
Установить столбец по умолчанию перед запуском COPY
. Вы можете сделать это внутри транзакции, если не хотите, чтобы другие вставки имели такую же настройку по умолчанию. (Команды DDL полностью транзакционны в Postgres.) Но это блокирует таблицу для остальной части транзакции (ACCESS EXCLUSIVE
lock ).
Или вы запускаете отдельную команду (в свою собственную транзакцию) до COPY
. Тогда по умолчанию, возможно, действует для одновременных транзакций. Но вам нужна только очень короткая блокировка таблицы.
-- BEGIN; -- optional transaction wrapper
ALTER TABLE pos ALTER file_id SET DEFAULT 462;
COPY pos(c1,c2,c3,c4,c5)
FROM 'C:/Users/.../filename.csv'
WITH (FORMAT CSV, HEADER FALSE, ENCODING 'UTF8'); -- unchanged!
-- ALTER TABLE pos ALTER file_id DROP DEFAULT; -- optional
-- COMMIT; -- if you BEGIN; also COMMIT;
Вы можете или не можете сбросить значение столбца по умолчанию для file_id
после COPY
. Если вы собираетесь запустить следующий COPY
с новым значением по умолчанию сразу после этого, вы можете просто установить это новое значение по умолчанию ...
Или вы можете захотеть записать старый столбец по умолчанию и сбросить его. См .: