¿Generando un UUID en Postgres para insertar declaración?
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.
uuid-ossp
es 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'.
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);
- 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)
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
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_extensions
catá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_extension
catá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.
pgcrypto
Extensión
A partir de Postgres 9.4, el pgcrypto
mó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 pgcrypto
el 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.