En Postgres 9.x, para una columna de tipo UUID
, ¿cómo especifico que se genere automáticamente un UUID como valor predeterminado para cualquier inserción de fila?
fuente
En Postgres 9.x, para una columna de tipo UUID
, ¿cómo especifico que se genere automáticamente un UUID como valor predeterminado para cualquier inserción de fila?
Llame DEFAULT
al definir una columna para invocar una de las funciones de uuid OSSP . El servidor 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 la extensión pgcrypto , considere la Respuesta de bpieck .
Si bien Postgres es compatible con el almacenamiento de valores de UUID (identificador único universal) en su forma nativa de 128 bits , la generación de valores de UUID requiere 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
. Vea mi publicación de blog para más detalles, o vea esta página en StackOverflow .
La extensión que queremos es una biblioteca de código abierto construida en C para trabajar con UUID, OSSP uuid . 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";
Consulte el documento de la extensión para ver una lista de múltiples comandos ofrecidos 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
Las variaciones posteriores sobre este tema se desarrollaron para tipos alternativos de UUID. Es posible que algunas personas no quieran registrar la dirección MAC real del servidor, por ejemplo, por cuestiones de seguridad o privacidad. La extensión Postgres genera cinco tipos de UUID, más el UUID "nulo" 00000000-0000-0000-0000-000000000000
.
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;
El complemento uuid-ossp puede generar varias versiones de UUID .
uuid_generate_v1()
uuid_generate_v1mc()
uuid_generate_v3( namespace uuid, name text )
uuid_generate_v4()
uuid_generate_v5( namespace uuid, name text )
uuid_nil()
00000000-0000-0000-0000-000000000000
. Se usa como indicador de un valor de UUID desconocido. Conocido como un UUID nulo .Para comparar los tipos, vea la pregunta, ¿Qué versión UUID para usar?
Si tiene curiosidad sobre las versiones 3 y 5, consulte esta pregunta, Generando v5 UUID. ¿Qué es el nombre y el espacio de nombres? .
Para obtener más información, consulte mi Respuesta a una pregunta similar y los valores de UUID de mi blog de JDBC a Postgres .
getObject()
, también puedes usarUUID id = rs.getObject("uuid_", UUID.class);
uuid_generate_v1
ouuid_generate_v1mc
.extensión pgcrypto
Solo una pequeña adición a la respuesta muy detallada de Basil:
Como actualmente la mayoría usa pgcrypto , en lugar de
uuid_generate_v1()
usted puede usargen_random_uuid()
un valor de UUID de la Versión 4 .Primero, habilite pgcrypto en sus Postgres.
CREATE EXTENSION "pgcrypto";
Simplemente establezca DEFAULT de una columna en
DEFAULT gen_random_uuid()
fuente