web-dev-qa-db-ja.com

PostgresのUUID列のデフォルト値

Postgres 9.xで、タイプ UUID の列の場合、行挿入のデフォルト値として自動的に生成されるUUIDを指定する方法?

76
Basil Bourque

tl; dr

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

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

すでに pgcrypto 拡張を使用している場合は、 Answer by bpieck を検討してください。

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

一方 Postgres すぐに使用できるstoringID(Universally Unique Identifier) ネイティブの値 128ビット 形式、生成UUID値にはプラグインが必要です。 Postgresでは、プラグインはextensionとして知られています。

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

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

_CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
_

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

さまざまな種類のUUID値を生成するために提供されている複数のコマンドのリストを確認するには、 extension’s doc を参照してください。コンピューターの 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の代わりに使用される乱数であると思われますが、これを区別するためにビットは通常のユニキャストではなくマルチキャストMACアドレスを示すように設定されています通常の実MACバージョン1 UUIDからのバージョン1のバリエーション。
  • uuid_generate_v3( namespace uuid, name text )
    MD5hash のテキストが含まれています仕様により バージョン3 UUID名前空間 ベースのUUIDとして定義されています。
  • uuid_generate_v4()
    ランダムに生成された128ビットの121〜122のデータに基づいています。 6または7 bits は、バージョンとバリアントを示すために使用されます。この種類の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に興味がある場合は、この質問 Generating v5 UUID。What is name and namespace? を参照してください。

詳細については、同様の質問への my Answer および私のブログ投稿 JDBCからPostgres へのUUID値を参照してください。

106
Basil Bourque

pgcrypto拡張

バジルの非常に詳細な回答へのほんの少しの追加:

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

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

_CREATE EXTENSION "pgcrypto";_

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

11
bpieck