Mi pregunta es bastante simple. Soy consciente del concepto de UUID y quiero generar uno para referirme a cada 'artículo' 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.
postgresql
uuid
postgresql-8.4
anon58192932
fuente
fuente
select dbo.uuid_generate_v4()
Respuestas:
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 posteriores) eso es fácil:
pero para 9.0 y versiones inferiores, debe ejecutar el script SQL para cargar la extensión. Consulte la documentación de los módulos contrib en 8.4 .
Para la página 9.1 y posteriores, lea los documentos de contribución actuales y
CREATE EXTENSION
. Estas características no existen en las versiones 9.0 o 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 y las extensiones contrib. Busque en su base de datos del administrador de paquetes 'postgres' y 'contrib'.
fuente
apt-get install postgresql-contrib
o similar. Intentaapt-cache search postgresql |grep contrib
encontrar el nombre del paquete que deseas.postgresql-contrib
paquete, obtendrá el error: ERROR: no se pudo abrir el archivo de control de extensión "/usr/share/postgresql/9.3/extension/uuid-ossp.control": No existe dicho archivo o directorioSin extensiones (trampa)
(funciona al menos en 8.4)
clock_timestamp()
explicación.Si necesita un UUID v4 válido
* Gracias a @Denis Stafichuk @Karsten y @autronix
Además, en Postgres modernos, simplemente puedes lanzar:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
fuente
uuid_in(md5(random()::text || now()::text)::cstring);
uuid-ossp
, pero por ejemplo estoy trabajando en una instancia de PostgreSQL donde no tengo los privilegios suficientes para instalar una extensión.clock_timestamp()
es la mejor alternativa en cualquier caso para esto. A diferencianow()
oCURRENT_TIMESTAMP
es volátil y devuelve la hora actual real.SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
Además, en los Postgres modernos, puedes simplemente lanzar:SELECT md5(random()::text || clock_timestamp()::text)::uuid
- no necesitas más magia. Caso de uso: stackoverflow.com/a/8335376/939860select overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
La respuesta de Craig Ringer es correcta. Aquí hay un poco más de información para Postgres 9.1 y posterior ...
¿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 unas pocas docenas de extensiones pueden estar disponibles.
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:Instalar extensión
Para instalar esa extensión relacionada con UUID , use el comando CREATE EXTENSION como se ve en este SQL:
Cuidado: encontré que los caracteres de MARCA DE COTIZACIÓN alrededor del nombre de la extensión son obligatorios, a pesar de la documentación que indique lo contrario.
El comité de estándares SQL o el equipo de Postgres eligieron un nombre extraño para ese comando. En mi opinión, deberían haber elegido algo como "INSTALAR EXTENSIÓN" o "USAR EXTENSIÓN".
Verificar 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:UUID como valor predeterminado
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 función Extensiones agregada a Postgres 9.1. En versiones anteriores, teníamos que buscar y ejecutar un script en un archivo .sql . Se agregó la función Extensiones 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. Vea mi publicación de blog para más discusión.
Tipos de UUID
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 un 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 original 1 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 más discusión, vea mi respuesta en la pregunta relacionada.
fuente
CREATE EXTENSION IF NOT EXISTS ...
si no está seguro y no desea verificar (en un script, por ejemplo)pgcrypto
ExtensiónA partir de Postgres 9.4, el
pgcrypto
módulo incluye lagen_random_uuid()
función. Esta función genera uno de los tipos de UUID de versión 4 basados en números aleatorios .Obtenga módulos contrib, si aún no están disponibles.
Usar
pgcrypto
módulo.La
gen_random_uuid()
función ahora debería estar disponible;Ejemplo de uso.
Cita del documento de Postgres en el
uuid-ossp
módulo.fuente
Después de leer la respuesta de @ ZuzEL, utilicé el código anterior como el valor predeterminado de la ID de la columna y funciona bien.
fuente
El próximo PostgreSQL 13 admitirá de forma nativa gen_random_uuid () sin necesidad de habilitar ninguna extensión:
demostración de violín db <>
fuente