web-dev-qa-db-ja.com

PostgreSQLでGUIDを作成する方法

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"

一意の行が返されるようにこれを修正する方法は?

12
Andrus

PostgreSQLにはuuid-ossp拡張機能は標準ディストリビューションに付属しており、uuidsを生成するための5つの標準アルゴリズムがあります。 guidはMicrosoftバージョンのuuidであり、概念的には同じものであることに注意してください。

CREATE EXTENSION "uuid-ossp";

次に:

SELECT uuid_generate_v4();

拡張機能をインストールすると、PostgreSQLには実際のバイナリuuidタイプがあり、長さは16バイトであることにも注意してください。バイナリタイプを使用すると、同等のテキストを使用するよりもはるかに高速で、必要なスペースも少なくなります。文字列バージョンが必要な場合は、単にtextにキャストできます。

SELECT uuid_generate_v4()::text;
22
Patrick