在PostgreSQL 11 Release Notes中,我发现了对分区功能的以下改进:
我需要此功能并对其进行测试。
创建表格:
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不起作用。
也许我做错了什么。也许有人尝试了此功能并知道它是如何工作的。 也许有人知道解决方法,除了在应用程序中实现约束。
答案 0 :(得分:1)
Postgres 11仅支持将外键从从分区表扩展到(未分区)表。
以前甚至不可能做到这一点,而这就是发行说明的内容。
此限制已在手册的chapter about partitioning中进行了记录
虽然分区表支持主键,但不支持引用分区表的外键。 (支持从分区表到其他表的外键引用。
(重点是我的)
答案 1 :(得分:0)
PostgreSQL v12.0 will probably support foreign keys that reference partitioned tables。但这仍不能保证,因为v12.0仍在开发中。