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?
PostgreSQL a le uuid-ossp
extension qui est livrée avec les distributions standard et dispose de 5 algorithmes standard pour générer uuid
s. 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;