Clarify restriction on partitioned tables primary key / unique indexes
От | David Rowley |
---|---|
Тема | Clarify restriction on partitioned tables primary key / unique indexes |
Дата | |
Msg-id | CAApHDvoU-u9iTqKjteYRFfi+UNEk7dbSAcyxEQD==vZt9B1KnA@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: Clarify restriction on partitioned tables primary key / unique indexes
|
Список | pgsql-hackers |
Over on [1], there was a question about why it wasn't possible to create the following table: CREATE TABLE foobar( id BIGINT NOT NULL PRIMARY KEY, baz VARCHAR NULL DEFAULT NULL ) PARTITION BY HASH(my_func(id)); The above is disallowed by 2 checks in DefineIndex(). 1. If the partitioned key contains an expression we disallow the addition of the constraint, per: /* * It may be possible to support UNIQUE constraints when partition * keys are expressions, but is it worth it? Give up for now. */ if (key->partattrs[i] == 0) ereport(ERROR, 2. We insist that the primary key / unique constraint contain all of the columns that the partitioned key does. We only mention #2 in the docs [2], but we don't mention anything about if the columns can be part of a function call or expression or not, per: "Unique constraints (and hence primary keys) on partitioned tables must include all 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." The attached attempts to clarify these restrictions more accurately based on the current code's restrictions. If there's no objections or suggestions for better wording, I'd like to commit the attached. David [1] https://www.postgresql.org/message-id/CAH7vdhNF0EdYZz3GLpgE3RSJLwWLhEk7A_fiKS9dPBT3Dz_3eA@mail.gmail.com [2] https://www.postgresql.org/docs/devel/ddl-partitioning.html
Вложения
В списке pgsql-hackers по дате отправления: