Можно ли использовать postgres / psql COPY в указанном c разделе таблицы? - PullRequest
0 голосов
/ 27 марта 2020

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

В соответствии с документацией по COPY здесь :

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

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

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

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

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

COPY some_table_partition_one FROM '/some_dir/some_file'

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Возможно по крайней мере с 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 ('2020-03-01') TO ('2020-03-31');
CREATE TABLE
CREATE TABLE measurement_y2020m04 PARTITION OF measurement
    FOR VALUES FROM ('2020-04-01') TO ('2020-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)
1 голос
/ 27 марта 2020

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

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

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

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

...