分区表上的PostgreSQL 11外键

时间:2018-12-21 13:10:17

标签: database-partitioning postgresql-11

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

  • 添加对分区表上的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不起作用。

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

2 个答案:

答案 0 :(得分:1)

Postgres 11仅支持将外键从分区表扩展到(未分区)表。

以前甚至不可能做到这一点,而这就是发行说明的内容。

此限制已在手册的chapter about partitioning中进行了记录

  

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

(重点是我的)

答案 1 :(得分:0)

PostgreSQL v12.0 will probably support foreign keys that reference partitioned tables。但这仍不能保证,因为v12.0仍在开发中。

您可以在以下帖子中使用depesz所述的触发器:part1part2part3