Генерация UUID в Postgres для оператора вставки?

196

Мой вопрос довольно прост. Я знаю концепцию UUID, и я хочу создать ее, чтобы ссылаться на каждый "элемент" из "магазина" в моей базе данных. Кажется разумным?

Проблема следующая строка возвращает ошибку:

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.

Я прочитал страницу по адресу: http://www.postgresql.org/docs/current/static/uuid-ossp.html

Изображение 399

Я запускаю Postgres 8.4 на Ubuntu 10.04 x64.

  • 6
    Postgres изначально поддерживает UUID как тип данных, даже может быть проиндексирован и использован в качестве первичного ключа. Но чтобы сгенерировать значение UUID, например, установить значение по умолчанию для столбца, вам нужно расширение Postgres (плагин). Многие сборки (дистрибутивы) Postgres включают такое расширение, но не активируют расширение. Посмотрите правильный ответ Крейга Рингера, чтобы узнать, как его активировать.
  • 2
    Если у вас установлен uuid-ossp и вы все еще получаете эту ошибку, попробуйте добавить префикс функции к имени вашей схемы, например, select dbo.uuid_generate_v4()
Теги:
uuid
postgresql-8.4

5 ответов

278
Лучший ответ

uuid-ossp - это модуль Contrib, поэтому он по умолчанию не загружается на сервер. Вы должны загрузить его в свою базу данных, чтобы использовать его.

Для современных версий PostgreSQL (9.1 и новее) это легко:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

но для 9.0 и ниже вместо этого вы должны запустить SQL script для загрузки расширения. См. документацию для модулей Contrib в 8.4.

Для Pg 9.1 и более новых вместо текущие вкладчики и CREATE EXTENSION. Эти функции не существуют в 9.0 или более ранних версиях, например 8.4.

Если вы используете пакетную версию PostgreSQL, вам может потребоваться установить отдельный пакет, содержащий модули и расширения Contrib. Найдите свою базу данных менеджера пакетов для "postgres" и "contrib".

  • 0
    Я должен набрать: pg_config --sharedir, чтобы узнать мой общий каталог для импорта модуля, но команда не работает ни в оболочке, ни в командной строке psql.
  • 0
    Поэтому мне пришлось запустить sudo apt-get install libpq-dev, чтобы запустить pg_config --sharedir, но теперь у меня нет папки «contrib» внутри моего sharedir, которая должна существовать в соответствии с postgresql.org/docs/8.4 /static/contrib.html
Показать ещё 9 комментариев
157

Без расширений (чит)

SELECT uuid_in(md5(random()::text || now()::text)::cstring);

output>> c2d29867-3d0b-d497-9191-18a9d8ee7830

(работает как минимум в 8.4)


Хорошая точка от @Erwin Brandstetter

SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);

Кроме того, в современных Postgres вы можете просто отличить:

SELECT md5(random()::text || clock_timestamp()::text)::uuid - не нужно больше магии

  • 1
    Это лучше, чем uuid-ossp ? uuid_in кажется, возвращает те же выходные данные для идентичных входов. Итак, если вы используете его для создания двух UUID в одно и то же время (или с одинаковыми результатами random() ), они будут равны.
  • 4
    Для отслеживания вашего PS: ВЫБЕРИТЕ uuid_in(md5(random()::text || now()::text)::cstring);
Показать ещё 11 комментариев
54

Ответ Крейга Рингера верен. Здесь немного больше информации о Postgres 9.1 и новее...

Доступно ли расширение?

Вы можете установить расширение только в том случае, если оно уже создано для вашей установки Postgres (ваш кластер в lingo Postgres). Например, я нашел расширение uuid-ossp, включенное как часть программы установки для Mac OS X, предоставлено компанией EnterpriseDB.com. Может быть доступно любое из несколько десятков расширений.

Чтобы узнать, доступно ли расширение uuid-ossp в вашем кластере Postgres, запустите этот SQL, чтобы запросить системный каталог pg_available_extensions:

SELECT * FROM pg_available_extensions;

Установить расширение

Чтобы установить расширение UUID, используйте CREATE EXTENSION, как показано в этом SQL:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Остерегайтесь: Я обнаружил, что символы QUOTATION MARK вокруг имени расширения требуются, несмотря на документацию об обратном.

Комитет стандартов SQL или команда Postgres выбрали странное имя для этой команды. На мой взгляд, они должны были выбрать что-то вроде "УСТАНОВИТЬ РАСШИРЕНИЕ" или "ИСПОЛЬЗОВАТЬ РАСШИРЕНИЕ".

Проверить установку

Вы можете проверить, что расширение было успешно установлено в нужную базу данных, запустив этот SQL для запроса системного каталога pg_extension:

SELECT * FROM pg_extension;

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

Для получения дополнительной информации см. вопрос: Значение по умолчанию для столбца UUID в Postgres

Старый путь

В приведенной выше информации используется новая функция расширения добавлена ​​ в Postgres 9.1. В предыдущих версиях нам пришлось найти и запустить script в файле .sql. Функция Расширения была добавлена, чтобы упростить установку, более активно работая над создателем расширения за меньшую работу со стороны пользователя/потребителя расширения. Дополнительную информацию см. В разделе в блоге.

  • 1
    И вы также можете использовать CREATE EXTENSION IF NOT EXISTS ... если вы не уверены и не хотите проверять (например, в сценарии)
  • 0
    UUID версии 4 подходит практически для любого набора данных размера, а не только для «ограниченного использования на небольших наборах строк». Вы должны будете генерировать 1 миллиард UUID в секунду в течение примерно 85 лет (или около 45 миллионов терабайт данных, в тысячи раз больше, чем самые большие базы данных сегодня), чтобы даже вероятность столкновения составляла 50%. Если вы не являетесь АНБ, Версия 4 хороша для любых целей. Версия 1, с другой стороны, страдала от того факта, что MAC-адреса назначались последовательно (и часто были подделаны или недоступны), что является частью того, почему были введены более поздние версии.
Показать ещё 6 комментариев
39

pgcrypto Расширение

Как и в Postgres 9.4, модуль pgcrypto включает функцию gen_random_uuid(). Эта функция генерирует одно из типов UUID версии 4, относящихся к произвольному номеру .

Получить модули Contrib, если они еще не доступны.

sudo apt-get install postgresql-contrib-9.4

Используйте модуль pgcrypto.

CREATE EXTENSION "pgcrypto";

Теперь доступна функция gen_random_uuid();

Пример использования.

INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;


Цитата из Модуль postgres doc on uuid-ossp.

Примечание. Если вам нужны только произвольно сформированные (версии 4) UUID, рассмотрите возможность использования функции gen_random_uuid() из модуля pgcrypto.

  • 3
    Да, но смотрите также blog.starkandwayne.com/2015/05/23/… где они предупреждают о фрагментации и предлагают вместо этого uuid-ossp.
  • 2
    На самом деле, смотрите postgresql.org/message-id/… где разоблачена проблема фрагментации uuid в Postgres
Показать ещё 1 комментарий
-2
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

Прочитав ответ @ZuzEL, я использовал приведенный выше код как значение по умолчанию для идентификатора столбца, и он отлично работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню