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


Відповіді:


92

тл; д-р

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

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

Плагін, необхідний для створення UUID

У той час як Postgres out-of-box підтримує збереження значень 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 від звичайного Real-MAC UUID версії 1.
  • 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, перегляньте це питання, генеруючи v5 UUID. Що таке ім’я та простір імен? .

Для більш детального обговорення дивіться мій відповідь на подібне запитання та моє значення 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.
Василь Бурк

7

розширення pgcrypto

Лише невелике доповнення до дуже детальної відповіді Василя:

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

По-перше, увімкніть pgcrypto у своїх Postgres.

CREATE EXTENSION "pgcrypto";

Просто встановіть DEFAULT стовпця на DEFAULT gen_random_uuid()

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.