7

在 PostgreSQL 11发行说明中,我发现了对分区功能的以下改进:

  • 添加对分区表上的 PRIMARY KEY、FOREIGN KEY、索引和触发器的支持

我需要此功能并对其进行了测试。

创建表:

CREATE TABLE public.tbl_test
(
    uuid character varying(32) NOT null,
    registration_date timestamp without time zone NOT NULL    
)
PARTITION BY RANGE (registration_date);

尝试创建主键:

ALTER TABLE public.tbl_test ADD CONSTRAINT pk_test PRIMARY KEY (uuid);

我收到错误 SQL 错误 [0A000]。如果使用复合 PK(uuid,registration_date)那么它的工作。因为 PK 包含分区列

结论:在分区表中创建 PK 有限制(PK 需要包含分区列)。

尝试创建外键

CREATE TABLE public.tbl_test2
(
    uuid character varying(32) NOT null,
    test_uuid character varying(32) NOT null
);

ALTER TABLE tbl_test2
   ADD CONSTRAINT fk_test FOREIGN KEY (test_uuid)
   REFERENCES tbl_test (uuid);

我收到错误 SQL 错误 [42809]。这意味着分区表上的 FOREIGN KEY 不起作用。

也许我做错了什么。也许有人尝试过这个功能并且知道它是如何工作的。也许有人知道解决方法,除了在应用程序中实现约束。

4

2 回答 2

11

PostgreSQL v12.0可能会支持引用分区表的外键但这仍然不能保证,因为 v12.0 仍在开发中。

对于 v11 和更低版本,您可以使用 depesz 在这些帖子中描述的触发器:part1part2part3

更新: PostgreSQL v12.0 于 2019 年 10 月 3 日发布,包含此功能

于 2019-05-04T15:47:05.590 回答
7

Postgres 11 仅支持分区表到(非分区)表的外键。

以前甚至不可能,这就是发行说明的内容。

此限制记录在手册中有关分区的章节中

虽然分区表支持主键,但不支持引用分区表的外键。(支持从分区表到其他表的外键引用。

(强调我的)

于 2018-12-21T13:22:22.517 回答