PostgreSQL10-是否可以按列表进行分区(col1,col2,…,colN)?

PostgreSQL10-是否可以按列表进行分区(col1,col2,…,colN)?,postgresql,partitioning,postgresql-10,Postgresql,Partitioning,Postgresql 10,我正在查看PostgreSQL以获取我的postgres版本 我希望在三列上创建表分区,我希望使用声明性分区和BY LIST方法来实现这一点 然而,我似乎找不到一个好的例子来说明如何处理更多的列,尤其是按列表处理 在上述文件中,我只阅读了: 您可以决定在分区键中为范围使用多列 分区,如果需要的话。(…)例如,考虑表范围 使用列lastname和firstname(按该顺序)作为 分区键 多个列上的声明性分区似乎只适用于按范围划分的,,或者这不对吗 然而,如果不是,我发现它告诉我如何通过列表和一列

我正在查看PostgreSQL以获取我的postgres版本

我希望在三列上创建表分区,我希望使用声明性分区和
BY LIST
方法来实现这一点

然而,我似乎找不到一个好的例子来说明如何处理更多的列,尤其是按列表处理

在上述文件中,我只阅读了:

您可以决定在分区键中为范围使用多列 分区,如果需要的话。(…)例如,考虑表范围 使用列lastname和firstname(按该顺序)作为 分区键

多个列上的声明性分区似乎只适用于按范围划分的
,或者这不对吗

然而,如果不是,我发现它告诉我如何通过列表和一列来处理
。但就我而言,我有三个专栏

我的想法是做如下事情(我很确定这是错误的):


我需要一个正确的实现,因为在我的例子中,可能的分区的组合相当多。

没错,不能使用具有多个分区键的列表分区。您也不能弯曲范围分区来做您想做的事情

但您可以使用复合类型来获得所需的:

CREATE TYPE part_type AS (a integer, b text);

CREATE TABLE partme (p part_type, val text) PARTITION BY LIST (p);

CREATE TABLE partme_1_B PARTITION OF partme FOR VALUES IN (ROW(1, 'B'));

INSERT INTO partme VALUES (ROW(1, 'B'), 'x');

INSERT INTO partme VALUES (ROW(1, 'C'), 'x');
ERROR:  no partition of relation "partme" found for row
DETAIL:  Partition key of the failing row contains (p) = ((1,C)).

SELECT (p).a, (p).b, val FROM partme;

 a | b | val 
---+---+-----
 1 | B | x
(1 row)

但也许最好的方法是使用子分区:将原始表按第一列进行分区,并按第二列进行分区。

谢谢您提供的信息!子分区呢?这会更糟吗?像
为(1)分区列表(col2)中的值创建my_partitioned_表的表part_1分区啊,你是对的。你为什么问你有没有比我更好的主意?:^)@一匹没有名字的马有点粗俗,但我不知道为什么不支持它。@一匹没有名字的马在文档或代码中有什么东西说它不受支持吗?
CREATE TYPE part_type AS (a integer, b text);

CREATE TABLE partme (p part_type, val text) PARTITION BY LIST (p);

CREATE TABLE partme_1_B PARTITION OF partme FOR VALUES IN (ROW(1, 'B'));

INSERT INTO partme VALUES (ROW(1, 'B'), 'x');

INSERT INTO partme VALUES (ROW(1, 'C'), 'x');
ERROR:  no partition of relation "partme" found for row
DETAIL:  Partition key of the failing row contains (p) = ((1,C)).

SELECT (p).a, (p).b, val FROM partme;

 a | b | val 
---+---+-----
 1 | B | x
(1 row)