Можно ли использовать postgres / psql COPY в определенном разделе таблицы?

В настоящее время я ищу эффективный способ размещения данных в многораздельной таблице. Можно ли использовать postgres / psql для копирования данных в определенный раздел таблицы (вместо использования INSERT)?

Согласно документации на COPY здесь :

COPY FROM может использоваться с простыми, сторонними или секционированными таблицами или с представлениями, которые имеют триггеры INSTEAD OF INSERT.

И согласно документации по разбиению здесь :

Помните, что COPY игнорирует правила. Если вы хотите использовать COPY для вставки данных, вам нужно будет скопировать их в правильную таблицу разделов, а не в мастер. COPY запускает триггеры, поэтому вы можете использовать их как обычно, если вы используете триггерный подход.

Из моего понимания вышеупомянутых ресурсов, кажется возможным скопировать в раздел; однако я не могу найти никаких примеров или поддержки для этого онлайн.

Другими словами, я могу написать что-то вроде:

COPY some_table_partition_one FROM '/some_dir/some_file'

Всего 2 ответа


Это возможно по крайней мере с PG 12.2:

CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);
CREATE TABLE
CREATE TABLE measurement_y2020m03 PARTITION OF measurement
    FOR VALUES FROM (񟭔-03-01') TO (񟭔-03-31');
CREATE TABLE
CREATE TABLE measurement_y2020m04 PARTITION OF measurement
    FOR VALUES FROM (񟭔-04-01') TO (񟭔-04-30');
CREATE TABLE
insert into measurement values (1, current_date, 10,100);
INSERT 0 1
select * from measurement;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       1 | 2020-03-27 |       10 |       100
(1 row)

cat /tmp/m.dat
4,2020-04-01,40,400
copy measurement_y2020m04 from '/tmp/m.dat' delimiter ','
COPY 1
select * from measurement;
 city_id |  logdate   | peaktemp | unitsales 
---------+------------+----------+-----------
       1 | 2020-03-27 |       10 |       100
       4 | 2020-04-01 |       40 |       400
(2 rows)

Ваша первая цитата из документации v11, вторая цитата из v10.

Это объясняет противоречие, потому что COPY к многораздельной таблице была введена в v11 :

Разрешить INSERT , UPDATE и COPY для многораздельных таблиц для правильной маршрутизации строк во внешние разделы (Etsuro Fujita, Amit Langote)

Но COPY непосредственно на раздел возможна во всех выпусках начиная с версии 10, где было введено декларативное разделение.


Есть идеи?

10000