web-dev-qa-db-ja.com

Postgres for InsertステートメントでUUIDを生成しますか?

私の質問はかなり簡単です。私はUUIDの概念を認識しており、私のDB内の 'store'からそれぞれの 'item'を参照するためのものを生成したいのです。合理的な権利のようですか?

問題は、次の行がエラーを返すことです。

honeydb=# insert into items values(
uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
ERROR:  function uuid_generate_v4() does not exist
LINE 2: uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
        ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

私はこのページを読んでいます: http://www.postgresql.org/docs/current/static/uuid-ossp.html

enter image description here

私はUbuntu 10.04 x 64上でPostgres 8.4を実行しています。

272
anon58192932

uuid-osspはcontribモジュールなので、デフォルトではサーバにロードされません。使用するには、データベースにロードする必要があります。

最新のPostgreSQLバージョン(9.1以降)では簡単です。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

しかし9.0以下では、代わりにSQLスクリプトを実行して拡張機能をロードする必要があります。 8.4 のcontribモジュールに関するドキュメントを参照してください。

Pg 9.1以降では、代わりに 現在の寄稿文書 および CREATE EXTENSION を読んでください。 8.4のように、これらの機能は9.0以前のバージョンには存在しません。

パッケージ版のPostgreSQLを使用している場合は、contribモジュールと拡張機能を含む別のパッケージをインストールする必要があります。パッケージマネージャデータベースで 'postgres'と 'contrib'を検索してください。

352
Craig Ringer

拡張子なし(チート)

SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);

output>> c2d29867-3d0b-d497-9191-18a9d8ee7830

(少なくとも8.4では動作します)

  • clock_timestamp()の説明をくれた@Erwin Brandstetterに感謝します。

有効なv4 UUIDが必要な場合

SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring);

enter image description here *おかげで @Denis Stafichuk @Karsten @autronix


また、現代のPostgresでは、単純にキャストすることができます:

SELECT md5(random()::text || clock_timestamp()::text)::uuid

215
ZuzEL

Craig Ringerによる回答 は正しいです。 Postgres 9.1以降の詳細情報は次のとおりです…

拡張機能は利用可能ですか?

拡張機能は、Postgresインストール用に既にビルドされている場合にのみインストールできます(Postgresの用語ではcluster)。たとえば、Mac OS Xのインストーラの一部として id-ossp 拡張が親切に含まれていることがわかりました 提供 EnterpriseDB.comによって。 数十個の拡張子 のいずれかが利用可能です。

Postgresクラスターでuuid-ossp拡張が使用可能かどうかを確認するには、このSQLを実行して pg_available_extensions システムカタログを照会します。

SELECT * FROM pg_available_extensions;

拡張機能をインストールする

UUID 関連の拡張機能をインストールするには、このSQLに示されているように CREATE EXTENSION コマンドを使用します。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

注意:反対の文書にもかかわらず、拡張名の周りにQUOTATION MARK文字が必要であることがわかりました。

SQL標準委員会またはPostgresチームは、そのコマンドに奇妙な名前を選択しました。私の考えでは、彼らは「拡張機能のインストール」や「拡張機能の使用」のようなものを選択すべきだった。

インストールを確認する

このSQLを実行して pg_extension システムカタログを照会することにより、目的のデータベースに拡張機能が正常にインストールされたことを確認できます。

SELECT * FROM pg_extension;

デフォルト値としてのUUID

詳細については、質問を参照してください: PostgresのUUID列のデフォルト値

オールドウェイ

上記の情報は、Postgres 9.1に新しいExtensions機能 追加 を使用しています。以前のバージョンでは、。sqlファイルでスクリプトを見つけて実行する必要がありました。拡張機能は、インストールをより簡単にするために追加されました。拡張機能のユーザー/消費者側の作業が少なくなるため、 拡張機能の作成者 の作業が少し増えます。詳細については、私の ブログ投稿 を参照してください。

UUIDの種類

ところで、質問のコードは関数uuid_generate_v4()を呼び出します。これにより、128ビットのほぼすべてがランダムに生成される Version 4 と呼ばれるタイプが生成されます。これは、小さな行セットでの限定的な使用には適していますが、衝突の可能性を事実上排除したい場合は、UUIDの別の「バージョン」を使用してください。

たとえば、元の バージョン1 は、ホストコンピューターの MACアドレス と現在の日時および任意の数を組み合わせたものであり、衝突の可能性は実質的にゼロです。

詳細については、関連する質問の my Answer を参照してください。

66
Basil Bourque

pgcrypto拡張

Postgres 9.4では、pgcryptoモジュールは gen_random_uuid() 関数を含みます。この関数は、乱数ベースの バージョン4のUUID のいずれかを生成します。

まだ利用できない場合はcontribモジュールを入手してください。

Sudo apt-get install postgresql-contrib-9.4

pgcryptoモジュールを使用してください。

CREATE EXTENSION "pgcrypto";

gen_random_uuid()関数が利用可能になりました。

使用例.

INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;


Postgres doc on uuid-ossp moduleから引用。

注:ランダムに生成された(バージョン4)UUIDのみが必要な場合は、代わりにpgcryptoモジュールからgen_random_uuid()関数を使用することを検討してください。

51
brillout
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

@ ZuzELの回答を読んだ後、上記のコードを列IDのデフォルト値として使用しましたが、問題はありません。

0
Paolo Fernandes