web-dev-qa-db-fra.com

Comment créer GUID dans PostgreSQL

Comment créer GUID au format Windows dans Postgres 9.0+?

J'ai essayé la fonction

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;

de

http://postgresql.1045698.n5.nabble.com/newid-in-postgres-td1879346.html

A essayé

select getguid()
union all
select getguid()

mais il renvoie les mêmes valeurs

"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"
"c41121ed-b6fb-c9a6-bc9b-574c82929e7e"

Comment résoudre ce problème afin que les lignes uniques soient retournées?

12
Andrus

PostgreSQL a le uuid-ossp extension qui est livrée avec les distributions standard et dispose de 5 algorithmes standard pour générer uuids. Notez qu'un guid est la version Microsoft d'un uuid, conceptuellement c'est la même chose.

CREATE EXTENSION "uuid-ossp";

Ensuite:

SELECT uuid_generate_v4();

Notez également que, une fois que vous avez installé l'extension, PostgreSQL a un véritable type binaire uuid, d'une longueur de 16 octets. Travailler avec le type binaire est beaucoup plus rapide que travailler avec l'équivalent texte et il prend moins de place. Si vous avez besoin de la version chaîne, vous pouvez simplement la convertir en text:

SELECT uuid_generate_v4()::text;
22
Patrick