Postgres 9.0 以降で Windows 形式の GUID を作成するにはどうすればいいですか?
機能を試してみた
CREATE or REPLACE FUNCTION public.getguid() RETURNS varchar AS $BODY$
DECLARE
v_seed_value varchar(32);
BEGIN
select
md5(
inet_client_addr()::varchar ||
timeofday() ||
inet_server_addr()::varchar ||
to_hex(inet_client_port())
)
into v_seed_value;
return (substr(v_seed_value,1,8) || '-' ||
substr(v_seed_value,9,4) || '-' ||
substr(v_seed_value,13,4) || '-' ||
substr(v_seed_value,17,4) || '-' ||
substr(v_seed_value,21,12));
END; $BODY$ LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER;
から
http://postgresql.1045698.n5.nabble.com/newid-in-postgres-td1879346.html
試してみた
select getguid()
union all
select getguid()
しかし、同じ値を返します
"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
一意の行が返されるようにこれを修正するにはどうすればよいですか?
ベストアンサー1
PostgreSQL には、uuid-ossp
標準ディストリビューションに同梱されている拡張機能があり、 を生成するための 5 つの標準アルゴリズムがあります。は の Microsoft バージョンであり、概念的には同じものであることuuid
に注意してください。guid
uuid
CREATE EXTENSION "uuid-ossp";
それから:
SELECT uuid_generate_v4();
また、拡張機能をインストールすると、PostgreSQL にはuuid
長さが 16 バイトの実際のバイナリ タイプが存在することに注意してください。バイナリ タイプでの作業は、テキスト バージョンでの作業よりもはるかに高速で、スペースも少なくて済みます。文字列バージョンが必要な場合は、次のようにキャストするだけですtext
。
SELECT uuid_generate_v4()::text;
PostgreSQL 13+
組み込み関数を使用できるようになりましたgen_random_uuid()
バージョン 4 のランダム UUID を取得します。