Создание UUID в инструкции Postgres for 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.

Ответ 1

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".

Ответ 2

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

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 - не нужно больше магии

Ответ 3

Ответ Крейга Рингера верен. Здесь немного больше информации о 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. Функция Расширения была добавлена, чтобы упростить установку, более активно работая над создателем расширения за меньшую работу со стороны пользователя/потребителя расширения. Дополнительную информацию см. В разделе в блоге.

Ответ 4

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.

Ответ 5

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

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