PostgreSQL主键长度限制

Fol*_*ord 15 postgresql varchar primary-key

主键列长度的限制是多少?我将使用varchar作为主键.我发现没有信息,它可以多长时间,因为PostgreSQL在用作主键时不需要指定varchar限制?

Pet*_*aut 20

B树索引中包含主键的值的最大长度是缓冲区页面大小的三分之一,默认为floor(8192/3)= 2730字节.


小智 6

我相信最大varchar长度是Postgres配置设置.但是,它看起来好像不能超过1GB.

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

话虽如此,将大型varchar列作为主键可能不是一个好主意.考虑使用序列号或bigserial(http://www.postgresql.org/docs/current/interactive/datatype-numeric.html#DATATYPE-SERIAL)

  • @DrColossos:只有在另一个表中使用所述varchar字段作为外键时才会出现这种情况.如果该字段只需要是UNIQUE且NOT NULL*并且*仅在该一个表中引用,则添加数字"PRIMARY KEY"实际上会对您造成伤害.现在,您将在NOT NULL varchar列上产生数字PK*和*附加UNIQUE INDEX的开销(为了确保数据完整性,需要).在谈论外键时这是一个很好的建议,但是说"varchar是一个糟糕的PK"会产生误导. (3认同)

Dan*_*lor 5

你应该做一个测试。

我已经在 PostgreSQL 8.4 上使用表进行了测试,该表具有单个 varchar 列作为主键。结果是,我能够存储 235000 个 ASCII 字符、116000 个波兰语变音字符 (fg '?') 或 75000 个中文 (fg '?')。对于较大的集合,我收到一条消息:
B??D:索引行大小 5404 超过了 btree 最大值,2712
但是,该消息表明:
不能对大于缓冲区页面 1/3 的值进行索引。
所以这些值是允许的,但不是整个字符串都用于唯一性检查。

嗯,这是您可以放入该列的大量数据。但是,如上所述,如果您必须使用如此长的值作为键,那么您的设计就很糟糕。您应该使用人工主键。