Postgresql 是否可以将postgres/psql复制到表的特定分区中?

Postgresql 是否可以将postgres/psql复制到表的特定分区中?,postgresql,postgresql-copy,Postgresql,Postgresql Copy,我目前正在研究一种有效的方法,将数据分配到分区表中。是否可以使用postgres/psql将数据复制到特定的表分区(而不是使用INSERT) 根据复印件上的文件: “复制自”可以用于普通表、外部表或分区表,也可以用于具有INSTEAD OF INSERT触发器的视图 根据关于分区的文档: 请注意,复制会忽略规则。如果要使用COPY插入数据,则需要将数据复制到正确的分区表中,而不是复制到主分区表中。复制不会触发触发器,因此如果使用触发器方法,则可以正常使用它 根据我对上述资源的理解,似乎可以复制到

我目前正在研究一种有效的方法,将数据分配到分区表中。是否可以使用postgres/psql将数据复制到特定的表分区(而不是使用INSERT)

根据复印件上的文件:

“复制自”可以用于普通表、外部表或分区表,也可以用于具有INSTEAD OF INSERT触发器的视图

根据关于分区的文档:

请注意,复制会忽略规则。如果要使用COPY插入数据,则需要将数据复制到正确的分区表中,而不是复制到主分区表中。复制不会触发触发器,因此如果使用触发器方法,则可以正常使用它

根据我对上述资源的理解,似乎可以复制到分区中;然而,我在网上找不到任何例子或支持

换言之,我可以这样写:

COPY some_table_partition_one FROM '/some_dir/some_file'

您的第一个报价来自v11文档,第二个报价来自v10

这就解释了矛盾,因为将
复制到分区表是:

允许分区表上的
插入
更新
复制
,以将行正确路由到外部分区(Etsuro Fujita、Amit Langote)


但是,自v10以来的所有版本都可以将
直接复制到分区,其中引入了声明性分区。

您的第一个引用来自v11文档,第二个引用来自v10

这就解释了矛盾,因为将
复制到分区表是:

允许分区表上的
插入
更新
复制
,以将行正确路由到外部分区(Etsuro Fujita、Amit Langote)


但是,在v10之后的所有版本中,都可以将
直接复制到分区,其中引入了声明性分区。

至少在第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)

至少在第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)

除了您已经说过的之外,我还测试了您的代码,发现拷贝甚至可以在不指定要插入的确切分区的情况下工作。例如:
从“/tmp/m.dat”分隔符“,”复制度量值_y2020m04将自动将数据分配到相关分区。x86_64-apple-darwin19.3.0上的PostgreSQL 12.2除了您已经说过的之外,我还测试了您的代码,发现拷贝甚至可以在不指定要插入的确切分区的情况下工作。例如:
从“/tmp/m.dat”分隔符“,”复制度量值_y2020m04将自动将数据分配到相关分区。x86_64-apple-darwin19.3.0上的PostgreSQL 12.2