2010-12-27 14 views
14

プライマリキーの列の長さの制限はいくらですか?私は主キーとしてvarcharを使用するつもりです。 PostgreSQLはプライマリキーとして使用するときにvarcharの制限を指定する必要がないので、情報が見つかりませんでした。PostgreSQLのプライマリキーの長さの制限

+2

私は、このような主キーに多くのデータを入れることができますが、それは良い考えではありません。すべての答えをありがとう。 – FolksLord

答えて

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型の列を持つことが、おそらく良いアイデアではありません。 (http://www.postgresql.org/docs/current/interactive/datatype-numeric.html#DATATYPE-SERIAL

+0

+1は、varcharが悪いPKであることに注意してください。これは参照テーブル内で使用するとパフォーマンスが悪くなります(最新のPGバージョンへのリンクを変更しました)。 – DrColossos

+2

@DrColossos:これは、上記のvarcharフィールドを別のテーブルの外部キーとして使用している場合にのみ当てはまります。そのフィールドが単にUNIQUEでなければならず、NULLではなく、*そのテーブルで参照されるだけの場合、数字の「PRIMARY KEY」を追加すると実際にあなたを傷つけるでしょう。 NOT NULL varchar列(データの整合性を保証するために必要)で数値PK *と*のUNIQUE INDEXをオーバーヘッドに掛けるようになりました。外来キーについて話すときには良いアドバイスですが、「varcharは悪いPKです」とは誤解を招くことです。 –

+0

@Matthewフォローアップのおかげで:Dは詳細と私のコメントを解釈する方法を完全に認識していませんでした。私は "[...]"参照テーブル内で使用すると、私はForeign Keysを意味するとはっきりしていましたが、あなたは明らかにこのトピックをより深く理解しました。今私はよく知っている、ありがとう! – DrColossos

19

主キーを含むBツリーインデックスの値の最大長は、バッファページのサイズの3分の1です。既定ではfloor(8192/3)です。 = バイト。

4

テストを実施する必要があります。

私は、PostgreSQL 8.4で単一のvarcharカラムを主キーとするテストを行いました。その結果、235000のASCII文字、116000の対義語(f.g. 'ć')または75000中国語(f.g. '汉')を保存することができました。
インデックスの行サイズ5404がbtreeの最大値を超える2712 バッファーページの1/3より大きい値は索引付けできません。
値は許可されていますが、一意性チェックには文字列全体が使用されていません。

これは、この列に入れることができる非常に大量のデータです。しかし、上記のように、キーのような長い値を使用する必要がある場合は、設計が貧弱です。人工主キーを使用する必要があります。