Мой вопрос довольно прост. Мне известна концепция 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
Я использую Postgres 8.4 на Ubuntu 10.04 x64.
postgresql
uuid
postgresql-8.4
anon58192932
источник
источник
select dbo.uuid_generate_v4()
Ответы:
uuid-ossp
это модуль contrib, поэтому по умолчанию он не загружается на сервер. Вы должны загрузить его в свою базу данных, чтобы использовать его.Для современных версий PostgreSQL (9.1 и новее) это просто:
но для 9.0 и ниже вы должны вместо этого запустить скрипт SQL для загрузки расширения. См. Документацию для модулей contrib в 8.4 .
Для Pg 9.1 и новее вместо этого прочтите текущие документы contrib и
CREATE EXTENSION
. Эти функции не существуют в 9.0 или более ранних версиях, таких как ваша 8.4.Если вы используете упакованную версию PostgreSQL, вам может потребоваться установить отдельный пакет, содержащий модули contrib и расширения. Найдите в вашей базе данных менеджера пакетов «postgres» и «contrib».
источник
apt-get install postgresql-contrib
или подобное. Попробуйтеapt-cache search postgresql |grep contrib
найти название пакета, который вы хотите.postgresql-contrib
пакет, вы получите сообщение об ошибке: ОШИБКА: не удалось открыть файл управления расширением "/usr/share/postgresql/9.3/extension/uuid-ossp.control": такого файла или каталога нетБез расширений (чит)
(работает как минимум в 8.4)
clock_timestamp()
объяснение.Если вам нужен действительный v4 UUID
* Спасибо @Denis Stafichuk @Karsten и @autronix
Также в современном Postgres вы можете просто разыграть:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
источник
uuid_in(md5(random()::text || now()::text)::cstring);
uuid-ossp
, но я, например, работаю над экземпляром PostgreSQL, где у меня нет достаточных привилегий для установки расширения.clock_timestamp()
это лучшая альтернатива в любом случае для этого. В отличие отnow()
илиCURRENT_TIMESTAMP
он изменчив и возвращает текущее время.SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
Кроме того, в современном Postgres вы можете просто разыграть:SELECT md5(random()::text || clock_timestamp()::text)::uuid
- не нужно больше магии. Пример использования: stackoverflow.com/a/8335376/939860select overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
Ответ на Крейга Рингера правильно. Вот немного больше информации для Postgres 9.1 и позже ...
Доступно ли расширение?
Вы можете установить расширение только в том случае, если оно уже было создано для вашей установки Postgres (ваш кластер в Postgres lingo). Например, я обнаружил расширение uuid-ossp, включенное как часть установщика для Mac OS X, любезно предоставленное EnterpriseDB.com. Может быть доступно любое из нескольких десятков расширений .
Чтобы узнать, доступно ли расширение uuid-ossp в вашем кластере Postgres, запустите этот SQL, чтобы запросить
pg_available_extensions
системный каталог:Установить расширение
Чтобы установить это расширение, связанное с UUID , используйте команду CREATE EXTENSION, как показано в этом SQL:
Осторожно: я обнаружил, что символы QUOTATION MARK вокруг имени расширения требуются, несмотря на обратное в документации.
Комитет по стандартам SQL или команда Postgres выбрали для этой команды нечетное имя. На мой взгляд, они должны были выбрать что-то вроде «INSTALL EXTENSION» или «USE EXTENSION».
Проверить установку
Вы можете убедиться, что расширение было успешно установлено в нужной базе данных, запустив этот SQL для запроса
pg_extension
системного каталога:UUID в качестве значения по умолчанию
Для получения дополнительной информации см. Вопрос: Значение по умолчанию для столбца UUID в Postgres.
По старому
Приведенная выше информация использует новую функцию расширений, добавленную в Postgres 9.1. В предыдущих версиях мы должны были найти и запустить скрипт в файле .sql . Функция «Расширения» была добавлена, чтобы упростить установку, торгуя немного больше работы для создателя расширения за меньшую работу со стороны пользователя / потребителя расширения. Смотрите мой блог для дальнейшего обсуждения.
Типы UUID
Кстати, код в вопросе вызывает функцию
uuid_generate_v4()
. Это генерирует тип, известный как Версия 4, где почти все из 128 битов генерируются случайным образом. Хотя это подходит для ограниченного использования на меньшем наборе строк, если вы хотите практически исключить любую возможность столкновения, используйте другую «версию» UUID.Например, оригинальная версия 1 сочетает в себе MAC-адрес хост-компьютера с текущей датой-временем и произвольным числом, вероятность коллизий практически равна нулю.
Для получения дополнительной информации см. Мой ответ на соответствующий вопрос.
источник
CREATE EXTENSION IF NOT EXISTS ...
если вы не уверены и не хотите проверять (например, в сценарии)pgcrypto
расширениеНачиная с Postgres 9.4,
pgcrypto
модуль включаетgen_random_uuid()
функцию. Эта функция генерирует один из типов UUID версии 4 на основе случайных чисел .Получить модули contrib, если они еще не доступны.
Используйте
pgcrypto
модуль.gen_random_uuid()
Функция в настоящее время должно доступна;Пример использования.
Цитата из Postgres doc о
uuid-ossp
модуле.источник
Прочитав ответ @ ZuzEL, я использовал приведенный выше код в качестве значения по умолчанию для идентификатора столбца, и он работает нормально.
источник
Предстоящий PostgreSQL 13 будет изначально поддерживать gen_random_uuid () без необходимости включать какие-либо расширения:
ДБ <> Fiddle Demo
источник