Значение по умолчанию для столбца UUID в Postgres

68

В Postgres 9.x для столбца типа UUIDкак указать UUID, который будет сгенерирован автоматически в качестве значения по умолчанию для любой вставки строки?

Базилик Бурк
источник

Ответы:

94

ТЛ; др

Вызов DEFAULTпри определении столбца для вызова одной из функций USSID OSSP . Сервер Postgres будет автоматически вызывать функцию каждый раз, когда вставляется строка.

CREATE TABLE tbl 
(
  pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
  CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
)

Если вы уже используете расширение pgcrypto , рассмотрите вариант ответа от bpieck .

Плагин, необходимый для генерации UUID

В то время как Postgres « из коробки» поддерживает сохранение значений UUID (универсального уникального идентификатора) в их собственной 128-битной форме, для генерации значений UUID требуется подключаемый модуль. В Postgres плагин известен как extension.

Чтобы установить расширение, позвоните CREATE EXTENSION. Чтобы избежать переустановки, добавьте IF NOT EXISTS. См. Мой пост в блоге для более подробной информации или эту страницу в StackOverflow .

Расширение, которое мы хотим, это библиотека с открытым исходным кодом, встроенная в C для работы с UUID, OSSP uuid . Сборки этой библиотеки для Postgres часто в комплекте с установкой Postgres , таких как графические монтажников предоставляемые по Enterprise DB или включенных облачных провайдеров , таких как Amazon RDS для PostgreSQL .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Создание различных видов UUID

См . Документацию к расширению, чтобы увидеть список нескольких команд, предлагаемых для генерации различных типов значений UUID. Чтобы получить оригинальную версию UUID, созданную на основе MAC-адреса компьютера, а также текущей даты и времени плюс небольшое случайное значение, позвоните uuid_generate_v1().

SELECT uuid_generate_v1();

672124b6-9894-11e5-be38-001d42e813fe

Более поздние вариации на эту тему были разработаны для альтернативных типов UUID. Некоторые люди могут не захотеть записывать фактический MAC-адрес сервера, например, из соображений безопасности или конфиденциальности. Расширение Postgres генерирует пять типов UUID, плюс «нулевой» UUID 00000000-0000-0000-0000-000000000000.

UUID в качестве значения по умолчанию

Этот вызов метода может быть сделан автоматически для генерации значения по умолчанию для любой вновь вставленной строки. При определении столбца укажите:

DEFAULT uuid_generate_v1()

См. Эту команду, использованную в следующем примере определения таблицы.

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;

UUID версии

UUID-OSSP плагин может генерировать различные версии UUID .

  • uuid_generate_v1()
    Содержит MAC-адрес текущего компьютера + текущий момент. Обычно используется, но избегайте, если вы чувствительны к раскрытию MAC-адреса вашего сервера базы данных или времени, когда это значение было сгенерировано. Определяется спецификацией как UUID версии 1 .
  • uuid_generate_v1mc()
    Как и в версии 1 , но со случайным многоадресным MAC-адресом вместо реального MAC-адреса. Очевидно, это способ использования Версии 1, но с заменой другого MAC, а не фактического MAC вашего сервера базы данных, если вы чувствительны к раскрытию этого факта.
    Что такое «случайный многоадресный MAC»? Я не знаю точно . После прочтения раздела 4.1.6 RFC 4122 , я подозреваю, что это случайное число, используемое вместо MAC, но с битами, установленными для указания MAC-адреса многоадресной рассылки, а не обычной одноадресной передачи, чтобы отличить этот вариант Версии 1 от обычного реальный MAC версия 1 UUID.
  • uuid_generate_v3( namespace uuid, name text )
    Содержит хеш MD5 текста, который вы предоставляете. Определяется спецификацией как Version 3 UUID , пространство имен -На UUID.
  • uuid_generate_v4()
    На основе случайно сгенерированных данных для 121-122 из 128 бит. Шесть или семь битов используются для обозначения версии и варианта. Этот вид UUID практичен , только если осуществляется с криптографически сильным генератором случайных чисел . Определяется спецификацией как UUID версии 4 .
  • uuid_generate_v5( namespace uuid, name text )
    То же, что и в версии 3, но с использованием хэширования SHA1 . Определяется спецификацией как UUID версии 5 .
  • uuid_nil()
    Особый случай, все биты установлены в ноль 00000000-0000-0000-0000-000000000000. Используется как флаг для неизвестного значения UUID. Известный как ноль UUID .

Для сравнения типов см. Вопрос, какую версию UUID использовать?

Если вам интересно узнать о версиях 3 и 5, см. Этот вопрос, « Генерация UUID v5». Что такое имя и пространство имен? ,

Для получения дополнительной информации см. Мой ответ на аналогичный вопрос и значения UUID в моем блоге от JDBC до Postgres .

Базилик Бурк
источник
1 000 000 обращений в Google для создания столбцов типа UUID. Ноль хитов за то, как офигеть на строки запроса этим ПК! : - @
Клинт Иствуд
@ClintEastwood Мой ответ на аналогичный вопрос, и в этом посте могут помочь значения UUID моего поста из JDBC в Postgres . Если этого окажется недостаточно, выложите новый Вопрос. Я был бы рад сделать еще один удар. Я понимаю ваше разочарование!
Базилик Бурк
@ClintEastwood: синтаксис для сравнения столбца UUID со значением соответствует синтаксису для констант, документированных в руководстве: postgresql.org/docs/current/static/… и введите приведенные ниже: postgresql.org/docs/current/static/…
a_horse_with_no_name
1
@BasilBourque: на самом деле нет необходимости разыгрывать результат, который getObject()вы также можете использоватьUUID id = rs.getObject("uuid_", UUID.class);
a_horse_with_no_name
1
@Rokit Чтобы проверить мощность генератора случайных чисел, посмотрите на реализацию с открытым исходным кодом, которая обернута этим расширением Postgres, проектом библиотеки UUID OSSP, как упомянуто в моем Ответе. И помните, UUID версии 4 следует использовать только в качестве крайней меры, если по какой-то причине вы не можете выбрать другие типы. Как правило, вашим первым выбором должна быть версия 1, позвонив либо uuid_generate_v1или uuid_generate_v1mc.
Базилик Бурк
8

расширение pgcrypto

Просто небольшое дополнение к очень подробному ответу Василия:

Поскольку в настоящее время большинство используют pgcrypto , вместо того , uuid_generate_v1()вы можете использовать gen_random_uuid()для UUID Version 4 значения.

Сначала включите pgcrypto в своем Postgres.

CREATE EXTENSION "pgcrypto";

Просто установите DEFAULT столбца в DEFAULT gen_random_uuid()

bpieck
источник