Ограничение длины первичного ключа PostgreSQL - PullRequest
15 голосов
/ 27 декабря 2010

Каков предел длины столбца первичного ключа?Я собираюсь использовать varchar в качестве первичного ключа.Я не нашел никакой информации, сколько это может длиться, поскольку PostgreSQL не требует указывать ограничение varchar при использовании в качестве первичного ключа?

Ответы [ 3 ]

20 голосов
/ 27 декабря 2010

Максимальная длина значения в индексе B-дерева, который включает в себя первичные ключи, составляет одну треть от размера страницы буфера, по умолчанию пол (8192/3) = 2730 байт.

6 голосов
/ 27 декабря 2010

Я считаю, что максимальная длина varchar является параметром конфигурации Postgres.Тем не менее, похоже, что его размер не может превышать 1 ГБ.

http://wiki.postgresql.org/wiki/FAQ#What_is_the_maximum_size_for_a_row.2C_a_table.2C_and_a_database.3F

При этом, вероятно, не очень хорошая идея иметь большой столбец varchar в качестве основногоключ.Попробуйте использовать серийный или большой сериал (http://www.postgresql.org/docs/current/interactive/datatype-numeric.html#DATATYPE-SERIAL)

4 голосов
/ 27 декабря 2010

Вы должны сделать тест.

Я сделал тесты с таблицей, в которой в качестве первичного ключа используется один столбец varchar, в PostgreSQL 8.4.В результате я смог сохранить 235000 символов ASCII, 116000 польских диалектических символов (fg 'ć') или 75000 китайских (fg '汉').Для больших наборов у меня есть сообщение:BŁĄD: размер строки индекса 5404 превышает максимум дерева, 2712Однако в сообщении сказано, что:Значения, превышающие 1/3 страницы буфера, не могут быть проиндексированы.Значения были разрешены, но не вся строка использовалась для проверки уникальности.

Что ж, это очень большой объем данных, который вы можете поместить в этот столбец.Однако, как отмечалось выше, ваш дизайн плох, если вам придется использовать такие длинные значения, как ключи.Вы должны использовать искусственный первичный ключ.

...