Thread: Documentation correction suggestion for primary key hashing on partitioned tables
Documentation correction suggestion for primary key hashing on partitioned tables
From
PG Doc comments form
Date:
The following documentation comment has been logged on the website: Page: https://www.postgresql.org/docs/17/ddl-partitioning.html Description: https://www.postgresql.org/docs/current/ddl-partitioning.html / 5.12.2.3. Limitations says: > To create a unique or primary key constraint on a partitioned table, the partition keys must not include any expressions or function calls and the constraint's columns must include all of the partition key columns. This limitation exists because the individual indexes making up the constraint can only directly enforce uniqueness within their own partitions; therefore, the partition structure itself must guarantee that there are not duplicates in different partitions. This seems to imply that if I have a table of primary key (a, b, c) in b-tree index, then a partition-by-hash method would require this full set of columns to be used in order for the constraints to be enforcable. However logically this should not be the case - only a hash of a prefix of the primary key - eg (a) or (a, b) should be needed to target the same table each time and hence get the constraint enforced. Testing this in postgres 16 seems to show that it does work like this.
Re: Documentation correction suggestion for primary key hashing on partitioned tables
From
Laurenz Albe
Date:
On Thu, 2025-04-24 at 09:48 +0000, PG Doc comments form wrote: > https://www.postgresql.org/docs/current/ddl-partitioning.html / 5.12.2.3. > Limitations says: > > > To create a unique or primary key constraint on a partitioned table, the > partition keys must not include any expressions or function calls and the > constraint's columns must include all of the partition key columns. This > limitation exists because the individual indexes making up the constraint > can only directly enforce uniqueness within their own partitions; therefore, > the partition structure itself must guarantee that there are not duplicates > in different partitions. > > This seems to imply that if I have a table of primary key (a, b, c) in > b-tree index, then a partition-by-hash method would require this full set of > columns to be used in order for the constraints to be enforcable. However > logically this should not be the case - only a hash of a prefix of the > primary key - eg (a) or (a, b) should be needed to target the same table > each time and hence get the constraint enforced. Testing this in postgres 16 > seems to show that it does work like this. From the above: To create a unique or primary key constraint on a partitioned table, [...] the constraint's columns must include all of the partition key columns. You seem to read it the other way around. Your example confirms what the documentation says. Yours, Laurenz Albe