utils - postgresql uuid_generate_v4() does not exist
¿Generando un UUID en Postgres para insertar declaración? (5)
Extensión pgcrypto
A partir de Postgres 9.4, el módulo pgcrypto
incluye la función gen_random_uuid()
. Esta función genera uno de los UUID tipo 4 basados en números aleatorios.
Obtenga módulos contrib, si no están ya disponibles.
sudo apt-get install postgresql-contrib-9.4
Utilice el módulo pgcrypto
.
CREATE EXTENSION "pgcrypto";
La función gen_random_uuid()
ahora debería estar disponible;
Ejemplo de uso.
INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, ''desc 1'', 31.94 ) ;
Cita del http://www.postgresql.org/docs/current/static/uuid-ossp.html módulo http://www.postgresql.org/docs/current/static/uuid-ossp.html .
Nota: Si solo necesita UUID generados aleatoriamente (versión 4), considere usar la función gen_random_uuid () del módulo pgcrypto.
Mi pregunta es bastante simple. Soy consciente del concepto de un UUID y quiero generar uno para referirme a cada "elemento" de una "tienda" en mi DB con. Parece razonable ¿no?
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.
Sin extensiones (trampa)
SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
output>> c2d29867-3d0b-d497-9191-18a9d8ee7830
(Funciona al menos en 8.4)
Buen punto de @Erwin Brandstetter para usar clock_timestamp()
Además, en los modernos Postgres, simplemente puedes lanzar:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
La respuesta de Craig Ringer es correcta. Aquí hay un poco más de información para Postgres 9.1 y versiones posteriores ...
¿La extensión está disponible?
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 http://www.postgresql.org/docs/current/static/uuid-ossp.html incluida como parte del instalador para Mac OS X amablemente provided por EnterpriseDB.com. Cualquiera de unas 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 catálogo del sistema pg_available_extensions
:
SELECT * FROM pg_available_extensions;
Instalar la extensión
Para instalar esa extensión relacionada con UUID , use el comando CREAR EXTENSIÓN como se ve en este este SQL:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Cuidado: encontré que los caracteres de QUOTATION MARK alrededor del nombre de la extensión son necesarios, a pesar de la documentación que indica lo contrario.
El comité de estándares SQL o el equipo de Postgres eligió un nombre impar para ese comando. En mi opinión, deberían haber elegido algo como "INSTALAR LA EXTENSIÓN" o "UTILIZAR LA EXTENSIÓN".
Verificar la instalacion
Puede verificar que la extensión se instaló correctamente en la base de datos deseada ejecutando este SQL para consultar el catálogo del sistema pg_extension
:
SELECT * FROM pg_extension;
UUID como valor por defecto
Para obtener más información, consulte la Pregunta: Valor predeterminado para la columna UUID en Postgres
El viejo camino
La información anterior utiliza la nueva característica de extensiones added a Postgres 9.1. En versiones anteriores, tuvimos que encontrar y ejecutar un script en un archivo .sql . La función de extensiones se agregó para facilitar la instalación, cambiando un poco más el trabajo por el creador de una extensión por menos trabajo por parte del usuario / consumidor de la extensión. Ver mi blog para más discusión.
Tipos de UUIDs
Por cierto, el código en 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 uso limitado en un conjunto más pequeño de filas, si desea eliminar virtualmente cualquier posibilidad de colisión, use 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 probabilidad de colisiones es prácticamente nula.
Para más discusión, vea mi respuesta en la pregunta relacionada.
uuid-ossp
es un módulo contrib, por lo que no se carga en el servidor de forma predeterminada. Debe cargarlo en su base de datos para usarlo.
Para las versiones modernas de PostgreSQL (9.1 y más nuevas) es fácil:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
pero para la versión 9.0 y posteriores debe ejecutar el script SQL para cargar la extensión. Consulte la documentación para los módulos contrib en 8.4 .
Para Pg 9.1 y versiones posteriores, lea los documentos de contribución actuales y CREATE EXTENSION
. Estas características no existen en 9.0 o versiones anteriores, como su 8.4.
Si está utilizando una versión empaquetada de PostgreSQL, es posible que necesite instalar un paquete separado que contenga los módulos contrib y las extensiones. Busque en la base de datos de su administrador de paquetes para ''postgres'' y ''contrib''.
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);
Después de leer la respuesta de @ZuzEL, utilicé el código anterior como el valor predeterminado de la ID de columna y está funcionando bien.