Создание UUID в Postgres для Инструкции Insert?

мой вопрос довольно прост. Я знаю концепцию 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

enter image description here

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

5 ответов


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

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

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

вместо Pg 9.1 и новее читать текущий contrib docs и CREATE EXTENSION. Эти функции не существуют в 9.0 или более старых версиях, таких как ваш 8.4.

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


без расширений (cheat)

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

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

(работает по крайней мере в 8.4)


хороший момент от @Erwin Brandstetter использовать clock_timestamp()

кроме того, в современных Postgres, вы можете просто бросить:

SELECT md5(random()::text || clock_timestamp()::text)::uuid


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

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

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

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

SELECT * FROM pg_available_extensions;

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

установить, что UUID-связанное расширение, используйте СОЗДАТЬ РАСШИРЕНИЕ команда, как видно в этом SQL:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

внимание: я нашел Символы кавычек вокруг имени расширения должны быть обязательными, несмотря на документацию наоборот.

комитет по стандартам SQL или команда Postgres выбрали нечетное имя для этой команды. На мой взгляд, они должны были выбрать что-то вроде "установить расширение" или "использовать расширение".

Проверка Установки

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

SELECT * FROM pg_extension;

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

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

Старый Способ

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

типы UUIDs

кстати, код в вопросе вызывает функцию uuid_generate_v4(). Это создает тип, известный как Вариант 4 где почти все 128 бит генерируются случайным образом. Хотя это нормально для ограниченного использования на меньшем наборе строк, Если вы хотите практически исключите любую возможность столкновения, используйте другую "версию" UUID.

например Вариант 1 сочетает в себе MAC-адрес главного компьютера с текущей датой-временем и произвольным числом вероятность столкновений практически равна нулю.

Подробнее см. В разделе мой ответ: по смежному вопросу.


pgcrypto расширение

по состоянию на Postgres 9.4,pgcrypto модуль включает в себя gen_random_uuid()


ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);

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