PostgresのUUID列のデフォルト値


回答:


94

tl; dr

コールDEFAULTの1呼び出すための列を定義するときOSSPのUUIDの機能を。Postgresサーバーは、行が挿入されるたびに関数を自動的に呼び出します。

CREATE TABLE tbl 
(
  pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
  CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
)

すでにpgcrypto拡張を使用している場合は、bpieckによる回答を検討してください

UUIDの生成に必要なプラグイン

ながら、Postgresのアウトオブボックスをサポート格納 UUID(汎用一意識別子)その天然の値を128ビット、フォーム生成 UUID値は、プラグインを必要とします。Postgresでは、プラグインはとして知られていextensionます。

拡張機能をインストールするには、を呼び出しますCREATE EXTENSION。再インストールを回避するには、を追加しIF NOT EXISTSます。詳細については私のブログ投稿を参照するか、StackOverflowのこのページを参照してください

必要な拡張機能は、UUIDを操作するためのCで構築されたオープンソースライブラリ、OSSP uuidです。Postgres用のこのライブラリビルドは、多くの場合、Enterprise DBが提供するグラフィカルインストーラーや、Amazon RDS for PostgreSQLなどのクラウドプロバイダーが含むPostgresのインストールにバンドルされています。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

さまざまな種類のUUIDの生成

参照してください。拡張子のdoc UUID値の様々な種類を生成するために提供され、複数のコマンドのリストを表示するには。コンピューターのMACアドレス、現在の日時、および小さなランダム値から構築されたUUIDの元のバージョンを取得するには、を呼び出しますuuid_generate_v1()

SELECT uuid_generate_v1();

672124b6-9894-11e5-be38-001d42e813fe

このテーマのその後のバリエーションは、別の種類のUUID用に開発されました。一部の人々は、例えばセキュリティやプライバシーの問題のために、サーバーの実際のMACアドレスを記録したくないかもしれません。Postgres拡張機能は、5種類のUUIDと「nil」UUIDを生成し00000000-0000-0000-0000-000000000000ます。

デフォルト値としてのUUID

そのメソッド呼び出しを自動的に実行して、新しく挿入された行のデフォルト値を生成できます。列を定義するときに、次を指定します。

DEFAULT uuid_generate_v1()

次のテーブル定義の例で使用されているコマンドを参照してください。

CREATE TABLE public.pet_
(
  species_ text NOT NULL,
  name_ text NOT NULL,
  date_of_birth_ text NOT NULL,
  uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),  -- <====
  CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.pet_
  OWNER TO postgres;

UUIDバージョン

UUID-OSSPプラグインが生成することができますUUIDのさまざまなバージョンを

  • uuid_generate_v1()
    現在のコンピューターのMACアドレス +現在の時刻が含まれます。一般的に使用されますが、データベースサーバーのMACの開示や、この値が生成された時間を気にする場合は避けてください。バージョン1 UUIDとして仕様で定義されています。
  • uuid_generate_v1mc()
    バージョン1に似ていますが、実際のMACアドレスの代わりにランダムマルチキャストMACアドレスを使用します。どうやらバージョン1を使用する方法ですが、データベースサーバーの実際のMACではなく、別のMACに置き換えることは、その事実を開示することに敏感な場合に使用します。
    「ランダムマルチキャストMAC」とは何ですか?正確にはわかりませんRFC 4122のセクション4.1.6を読んだ後、これはMACの代わりに使用される乱数であると思われますが、バージョン1のこのバリエーションを通常のものと区別するために、通常のユニキャストではなくマルチキャストMACアドレスを示すビットが設定されていますreal-MACバージョン1 UUID。
  • uuid_generate_v3( namespace uuid, name text )
    指定したテキストのMD5 ハッシュが含まれます。仕様により、バージョン3 UUID名前空間ベースのUUID として定義されます
  • uuid_generate_v4()
    128ビットのうち121〜122のランダムに生成されたデータに基づきます。バージョンとバリアントを示すために使用される6または7 ビット。この種類のUUIDは、暗号的に強力なランダムジェネレーターで実装されている場合にのみ実用的です。バージョン4 UUIDとして仕様で定義されています。
  • uuid_generate_v5( namespace uuid, name text )
    バージョン3と同じですが、SHA1ハッシュを使用します。バージョン5 UUIDとして仕様で定義されています。
  • uuid_nil()
    特別な場合、すべてのビットがゼロに設定されます00000000-0000-0000-0000-000000000000。不明なUUID値のフラグとして使用されます。nil UUIDとして知られています。

タイプを比較するには、質問、使用するUUIDバージョンを参照してください

バージョン3と5に興味がある場合は、この質問、v5 UUIDの生成を参照してください名前と名前空間とは何ですか?

詳細については、同様の質問への回答と、JDBCからPostgresへのブログ投稿UUID値を参照しください。


タイプUUIDの列を作成する方法について、Googleで1,000,000ヒット。そのpkでクエリ行をフリークする方法についてはゼロヒット!! :-@
クリントイーストウッド

@ClintEastwood 同様の質問に対する私の答えと私のブログ投稿では、JDBCからPostgresへのUUID値が役立つかもしれません。それらが不十分であることが判明した場合、新しい質問を投稿してください。私はそれをもう一度突き刺せてうれしいです。あなたの不満を理解しています!
バジルブルク

@ClintEastwood:値をUUID列を比較するための構文は、マニュアルに記載された定数の構文を次に示します。postgresql.org/docs/current/static/...とタイプがキャスト:postgresql.org/docs/current/static/...を
a_horse_with_no_name

1
@BasilBourque:getObject()使用できる結果をキャストすることは本当に必要ではありませんUUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name

1
@Rokit乱数ジェネレーターの強度を確認するには、このPostgres拡張機能でラップされている基礎となるオープンソース実装、私の回答で述べたOSSP uuidライブラリプロジェクトを調べてください。また、何らかの理由で他のタイプを選択できない場合、バージョン4 UUIDは最後の手段としてのみ使用してください。通常、最初の選択は、uuid_generate_v1またはのいずれかを呼び出して、バージョン1の種類にする必要がありますuuid_generate_v1mc
バジルブルク

8

pgcrypto拡張

バジルの非常に詳細な答えへのほんの小さな追加:

現在、ほとんどがpgcryptouuid_generate_v1()を使用しているgen_random_uuid()ため、バージョン4のUUID値に使用する代わりに使用できます。

まず、Postgresでpgcryptoを有効にします。

CREATE EXTENSION "pgcrypto";

列のDEFAULTを設定するだけです DEFAULT gen_random_uuid()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.