¿Generando un UUID en Postgres para insertar declaración?

Resuelto fIwJlxSzApHEZIl asked hace 12 años • 12 respuestas

Mi pregunta es bastante simple. Conozco el concepto de UUID y quiero generar uno para hacer referencia a cada 'elemento' de una 'tienda' en mi base de datos. Parece razonable ¿verdad?

El problema es que la siguiente línea devuelve un error:

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.

He leído la página en: http://www.postgresql.org/docs/current/static/uuid-ossp.html

Estoy ejecutando Postgres 8.4 en Ubuntu 10.04 x64.

fIwJlxSzApHEZIl avatar Sep 20 '12 08:09 fIwJlxSzApHEZIl
Aceptado

uuid-osspes un módulo de contribución, por lo que no se carga en el servidor de forma predeterminada. Debes cargarlo en tu base de datos para usarlo.

Para las versiones modernas de PostgreSQL (9.1 y posteriores), eso es fácil:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

pero para 9.0 y versiones anteriores, debe ejecutar el script SQL para cargar la extensión. Consulte la documentación de los módulos de contribución en 8.4 .

Para la página 9.1 y posteriores, lea los documentos de contribución actuales y CREATE EXTENSION. Estas funciones no existen en la versión 9.0 o anterior, como la 8.4.

Si está utilizando una versión empaquetada de PostgreSQL, es posible que necesite instalar un paquete separado que contenga los módulos y extensiones de contrib. Busque en la base de datos de su administrador de paquetes 'postgres' y 'contrib'.

Craig Ringer avatar Sep 20 '2012 02:09 Craig Ringer

Sin extensiones (trampa)

Si necesita un UUID v4 válido

SELECT uuid_in(overlay(overlay(md5(random()::text || ':' || random()::text) placing '4' from 13) placing to_hex(floor(random()*(11-8+1) + 8)::int)::text from 17)::cstring);

ingrese la descripción de la imagen aquí

  • Gracias a @Denis Stafichuk @Karsten y @autronix

O simplemente puede obtener un valor similar a UUID haciendo esto (si no le importa la validez):

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

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

(funciona al menos en 8.4)

ZuzEL avatar Jan 24 '2014 07:01 ZuzEL

PostgreSQL 13 admite de forma nativa gen_random_uuid () :

PostgreSQL incluye una función para generar un UUID:

gen_random_uuid () → uuid

Esta función devuelve un UUID de la versión 4 (aleatorio). Este es el tipo de UUID más utilizado y es apropiado para la mayoría de las aplicaciones.

demostración de db<>violín

Lukasz Szozda avatar May 23 '2020 10:05 Lukasz Szozda

La respuesta de Craig Ringer es correcta. Aquí hay un poco más de información para Postgres 9.1 y posteriores...

¿Está disponible la extensión?

Solo puede instalar una extensión si ya se ha creado para su instalación de Postgres (su clúster en la jerga de Postgres). Por ejemplo, encontré la extensión uuid-ossp incluida como parte del instalador para Mac OS X amablemente proporcionado por EnterpriseDB.com. Cualquiera de las pocas docenas de extensiones puede estar disponible.

Para ver si la extensión uuid-ossp está disponible en su clúster de Postgres, ejecute este SQL para consultar el pg_available_extensionscatálogo del sistema:

SELECT * FROM pg_available_extensions;

Instalar extensión

Para instalar esa extensión relacionada con UUID , use el comando CREATE EXTENSION como se ve en este SQL:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Cuidado: encontré que las comillas alrededor del nombre de la extensión son obligatorias, a pesar de que la documentación indique lo contrario.

El comité de estándares SQL o el equipo de Postgres eligió un nombre extraño para ese comando. En mi opinión, deberían haber elegido algo como "INSTALAR EXTENSIÓN" o "UTILIZAR EXTENSIÓN".

Verificar la instalación

Puede verificar que la extensión se instaló correctamente en la base de datos deseada ejecutando este SQL para consultar el pg_extensioncatálogo del sistema:

SELECT * FROM pg_extension;

UUID como valor predeterminado

Para obtener más información, consulte la Pregunta: Valor predeterminado para la columna UUID en Postgres

A la antigua usanza

La información anterior utiliza la nueva función Extensiones agregada a Postgres 9.1. En versiones anteriores, teníamos que buscar y ejecutar un script en un archivo .sql . La función Extensiones se agregó para facilitar la instalación, intercambiando un poco más de trabajo para el creador de una extensión por menos trabajo por parte del usuario/consumidor de la extensión. Consulte la publicación de mi blog para obtener más información.

Tipos de UUID

Por cierto, el código de la Pregunta llama a la función uuid_generate_v4(). Esto genera un tipo conocido como Versión 4 donde casi todos los 128 bits se generan aleatoriamente. Si bien esto está bien para un uso limitado en un conjunto más pequeño de filas, si desea eliminar prácticamente cualquier posibilidad de colisión, utilice otra "versión" de UUID.

Por ejemplo, la Versión 1 original combina la dirección MAC de la computadora host con la fecha y hora actual y un número arbitrario, la posibilidad de colisiones es prácticamente nula.

Para obtener más información, consulte mi respuesta a una pregunta relacionada.

Basil Bourque avatar Feb 12 '2013 04:02 Basil Bourque

pgcryptoExtensión

A partir de Postgres 9.4, el pgcryptomódulo incluye la gen_random_uuid()función. Esta función genera uno de los tipos de UUID de la versión 4 basados ​​en números aleatorios .

Obtenga módulos de contribución, si aún no están disponibles.

sudo apt-get install postgresql-contrib-9.4

Utilice pgcryptoel módulo.

CREATE EXTENSION "pgcrypto";

La gen_random_uuid()función ahora debería estar disponible;

Uso de ejemplo.

INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;


Cita del documento de Postgres sobreuuid-ossp el módulo.

Nota: Si solo necesita UUID generados aleatoriamente (versión 4), considere usar la función gen_random_uuid() del módulo pgcrypto.

brillout avatar Feb 08 '2015 16:02 brillout