Solución:
tl; dr
Llama DEFAULT
al definir una columna para invocar uno de los Uuid OSSP funciones. El servidor de Postgres invocará automáticamente la función cada vez que se inserte una fila.
CREATE TABLE tbl
(
pkey UUID NOT NULL DEFAULT uuid_generate_v1() ,
CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
)
Si ya usa el pgcrypto extensión, considere la respuesta de bpieck.
Complemento necesario para generar UUID
Mientras que Postgres es compatible con almacenar Valores de UUID (Universal Unique Identifier) en su forma nativa de 128 bits, generando Los valores de UUID requieren un complemento. En Postgres, un complemento se conoce como extension
.
Para instalar una extensión, llame CREATE EXTENSION
. Para evitar la reinstalación, agregue IF NOT EXISTS
. Consulte la publicación de mi blog para obtener más detalles o consulte esta página en StackOverflow.
La extensión que queremos es una biblioteca de código abierto construida en C para trabajar con UUID, Uuid OSSP. Una compilación de esta biblioteca para Postgres a menudo se incluye con una instalación de Postgres, como los instaladores gráficos proporcionados por Enterprise DB o incluidos por proveedores en la nube como Amazon RDS para PostgreSQL.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Generando varios tipos de UUID
Consulte el documento de la extensión para ver una lista de los múltiples comandos que se ofrecen para generar varios tipos de valores UUID. Para obtener la versión original de UUID construida a partir de la dirección MAC de la computadora más la fecha y hora actual más un pequeño valor aleatorio, llame uuid_generate_v1()
.
SELECT uuid_generate_v1();
672124b6-9894-11e5-be38-001d42e813fe
Se desarrollaron variaciones posteriores sobre este tema para tipos alternativos de UUID. Es posible que algunas personas no quieran registrar la dirección MAC real del servidor, por ejemplo, por motivos de seguridad o privacidad. La extensión de Postgres genera cinco tipos de UUID, más el UUID “nulo” 00000000-0000-0000-0000-000000000000
.
UUID como valor predeterminado
Esa llamada al método se puede realizar automáticamente para generar un valor predeterminado para cualquier fila recién insertada. Al definir la columna, especifique:
DEFAULT uuid_generate_v1()
Vea ese comando usado en la siguiente definición de tabla de ejemplo.
CREATE TABLE public.pet_
(
species_ text NOT NULL,
name_ text NOT NULL,
date_of_birth_ text NOT NULL,
uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(), -- <====
CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.pet_
OWNER TO postgres;
Versiones de UUID
los uuid-ossp El complemento puede generar varias versiones de UUID.
-
uuid_generate_v1()
Contiene la dirección MAC de la computadora actual + momento actual. De uso común, pero evítelo si es sensible a la divulgación de la MAC de su servidor de base de datos o la hora en que se generó este valor. Definido por especificación como UUID Versión 1. -
uuid_generate_v1mc()
Como la versión 1, pero con una dirección MAC de multidifusión aleatoria en lugar de la dirección MAC real. Aparentemente, es una forma de usar la Versión 1, pero sustituyendo otra MAC en lugar de la MAC real de su servidor de base de datos si es sensible a revelar ese hecho.
¿Qué es un ‘MAC de multidifusión aleatoria’? No sé exactamente. Después de leer la sección 4.1.6 de RFC 4122, sospecho que este es un número aleatorio usado en lugar del MAC pero con bits configurados para indicar una dirección MAC de multidifusión en lugar de la unicast habitual para distinguir esta variación de la Versión 1 de una habitual. UUID versión 1 de MAC real. -
uuid_generate_v3( namespace uuid, name text )
Contiene un hash MD5 del texto que proporcionas. Definido por especificación como UUID Versión 3, UUID basado en espacio de nombres. -
uuid_generate_v4()
Basado en datos generados aleatoriamente para 121-122 de los 128 bits. Se utilizan seis o siete bits para indicar versión y variante. Este tipo de UUID es práctico solo si se implementa con un generador aleatorio criptográficamente fuerte. Definido por especificación como UUID Versión 4. -
uuid_generate_v5( namespace uuid, name text )
Igual que la versión 3 pero con hash SHA1. Definido por especificación como UUID Versión 5. -
uuid_nil()
Un caso especial, todos los bits puestos a cero00000000-0000-0000-0000-000000000000
. Se utiliza como bandera para un valor UUID desconocido. Conocido como UUID nulo.
Para comparar tipos, consulte la pregunta, ¿Qué versión de UUID usar?
Si solo está interesado en la versión 4 (generada aleatoriamente) y ya está utilizando pgcrypto, vea la respuesta de bpieck.
Si tiene curiosidad acerca de las Versiones 3 y 5, consulte esta Pregunta, Generación de UUID v5. ¿Qué es el nombre y el espacio de nombres?
Para obtener más información, consulte mi Respuesta a una pregunta similar y la publicación de mi blog. Valores UUID de JDBC a Postgres.
pgcrypto extensión
Solo una pequeña adición a la respuesta muy detallada de Basil.
Dado que actualmente la mayoría usa pgcrypto, en lugar de uuid_generate_v4()
puedes usar gen_random_uuid()
para un valor UUID de la versión 4.
Primero, habilite pgcrypto en tu Postgres.
CREATE EXTENSION "pgcrypto";
Simplemente establezca DEFAULT de una columna en
DEFAULT gen_random_uuid()