私の質問はかなり簡単です。私は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
私はUbuntu 10.04 x 64上でPostgres 8.4を実行しています。
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'を検索してください。
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);
*おかげで @Denis Stafichuk @Karsten と @autronix
また、現代のPostgresでは、単純にキャストすることができます:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
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;
詳細については、質問を参照してください: PostgresのUUID列のデフォルト値
上記の情報は、Postgres 9.1に新しいExtensions機能 追加 を使用しています。以前のバージョンでは、。sqlファイルでスクリプトを見つけて実行する必要がありました。拡張機能は、インストールをより簡単にするために追加されました。拡張機能のユーザー/消費者側の作業が少なくなるため、 拡張機能の作成者 の作業が少し増えます。詳細については、私の ブログ投稿 を参照してください。
ところで、質問のコードは関数uuid_generate_v4()
を呼び出します。これにより、128ビットのほぼすべてがランダムに生成される Version 4 と呼ばれるタイプが生成されます。これは、小さな行セットでの限定的な使用には適していますが、衝突の可能性を事実上排除したい場合は、UUIDの別の「バージョン」を使用してください。
たとえば、元の バージョン1 は、ホストコンピューターの MACアドレス と現在の日時および任意の数を組み合わせたものであり、衝突の可能性は実質的にゼロです。
詳細については、関連する質問の my Answer を参照してください。
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()関数を使用することを検討してください。
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);
@ ZuzELの回答を読んだ後、上記のコードを列IDのデフォルト値として使用しましたが、問題はありません。