504

私の質問はかなり単純です。私はUUIDの概念を知っており、DB内の「ストア」から各「アイテム」を参照するためにUUIDを生成したいと考えています。合理的な権利のようですか?

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

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

ここに画像の説明を入力してください

Ubuntu10.04x64でPostgres8.4を実行しています。

4

8 に答える 8

576

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

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

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

Pg 9.1以降の場合は、代わりに現在のcontribドキュメントとをお読みくださいCREATE EXTENSION。これらの機能は、8.4などの9.0以前のバージョンには存在しません。

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

于 2012-09-20T02:03:29.550 に答える
422

拡張なし(チート)

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

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

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

  • 説明してくれた@ErwinBrandstetterに感謝しclock_timestamp()ます。

有効なv4UUIDが必要な場合

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);

ここに画像の説明を入力してください * @DenisStafichuk@ Karsten@autronixに感謝します


また、最新のPostgresでは、次のようにキャストできます。

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

于 2014-01-24T07:57:36.780 に答える
96

クレイグ・リンガーの答えは正しいです。Postgres9.1以降の詳細は次のとおりです…</p>

拡張機能は利用できますか?

拡張機能は、Postgresインストール( Postgres lingoのクラスター)用に既にビルドされている場合にのみインストールできます。たとえば、EnterpriseDB.comから提供されたMacOSXのインストーラーの一部としてuuid-ossp拡張機能が含まれていることがわかりました。数十の拡張機能のいずれかが利用できる場合があります。

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

SELECT * FROM pg_available_extensions;

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

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

注意:反対のドキュメントがあるにもかかわらず、拡張子名の前後に引用符が必要であることがわかりました。

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

インストールの確認

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

SELECT * FROM pg_extension;

デフォルト値としてのUUID

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

古い方法

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

UUIDのタイプ

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

たとえば、元のバージョン1は、ホストコンピュータのMACアドレスを現在の日時および任意の数と組み合わせているため、衝突の可能性はほとんどありません。

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

于 2013-02-12T04:03:34.120 に答える
79

pgcrypto拡大

Postgres 9.4以降、pgcryptoモジュールにはgen_random_uuid()関数が含まれています。この関数は、乱数ベースのバージョン4タイプのUUIDの1つを生成します。

まだ利用できない場合は、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ドキュメントuuid-ossp からの引用。

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

于 2015-02-08T16:40:04.520 に答える
72

PostgreSQL 13はネイティブに gen_random_uuid()をサポートします:

PostgreSQLには、UUIDを生成するための1つの関数が含まれています。

gen_random_uuid () → uuid

この関数は、バージョン4(ランダム)のUUIDを返します。これは最も一般的に使用されるタイプのUUIDであり、ほとんどのアプリケーションに適しています。

db<>フィドルデモ

于 2020-05-23T10:49:30.403 に答える
23

2021年からの更新では、ステートメントで自動生成するための凝ったトリックは必要ありませんuuidinsert

ただ1つのことをしてください:

  1. のデフォルト値を列に設定DEFAULT gen_random_uuid ()しますuuid。以上です。

たとえば、次のようなテーブルがあります。

CREATE TABLE table_name (
    unique_id UUID DEFAULT gen_random_uuid (),
    first_name VARCHAR NOT NULL,
    last_name VARCHAR NOT NULL,
    email VARCHAR NOT NULL,
    phone VARCHAR,
    PRIMARY KEY (unique_id)
);

これで、uuid値をunique_id列に自動挿入するために何もする必要はありません。すでにデフォルト値を定義しているためです。他の列への挿入に集中するだけで、postgresqlの面倒を見ることができますunique_id。次に、挿入ステートメントのサンプルを示します。

INSERT INTO table_name (first_name, last_name, email, phone) 
VALUES (
    'Beki',
    'Otaev',
    'beki@bekhruz.com',
    '123-456-123'
)

unique_idすでに処理されているため、挿入がないことに注意してください。

のような他の拡張機能については、postgresの標準機能uuid-osspに満足できない場合にそれらを使用できます。gen_random_uuid ()ほとんどの場合、それらがなくても大丈夫です

于 2021-06-12T03:43:19.783 に答える
3
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

@ZuzELの回答を読んだ後、上記のコードを列IDのデフォルト値として使用しましたが、正常に機能しています。

于 2015-03-19T14:57:52.580 に答える
1

uuid-osspモジュールは、ユニバーサル一意識別子(UUID)を生成する関数を提供します

uuid_generate_v1()この関数は、バージョン1のUUIDを生成します。

  1. 拡張機能を追加

存在しない場合は拡張機能を作成する"uuid-ossp";

  1. 拡張機能を確認する

SELECT * FROM pg_extension;

  1. クエリを実行する

INSERT INTO table_name(id、column1、column2、column3、...)VALUES(uuid_generate_v1()、value1、value2、value3 ...);

テーブルデータを確認する

于 2021-09-02T12:05:32.400 に答える