Postgres 11 - 对具有 NULL 值的日期列进行范围分区

dan*_*l9x 3 postgresql null partitioning

我们有一个表结构,父记录和子记录位于同一个表中。它们通过列 ( parentId ) 引用,该列引用父记录(顶部父记录上为 null)。此外,我们有一个请求的日期列,我们通过该列进行所有查询,但唯一具有此值的记录是父记录。

由于我们所有的查询最初都是根据父结果进行过滤并使用此日期,因此我们希望在此日期范围内对表进行分区,但我们知道这是不可能的,因为子记录的记录中存在空值。

除了在数据库中的每个子记录上创建一个“虚拟”值(一些永远不会在我们的过滤器中捕获的任意日期)之外,我们还有什么其他选择?是否不可能以某种方式为我们从未查询过的所有空值创建一个单独的分区?

jja*_*nes 8

PostgreSQL 11 允许您为范围分区表创建默认分区,该分区将接收 NULL 值。

如果您想防止现有分区未覆盖的其他行进入该默认表,您可以添加一个检查约束,要求该列为 NULL。

create table for_nulls PARTITION OF parent_table (check (date_requested is null)) DEFAULT;
Run Code Online (Sandbox Code Playgroud)