Базы данных

Generate UUID in PostgreSQL for INSERT – Step-by-Step Guide

Learn how to enable and use uuid_generate_v4() in PostgreSQL 8.4 on Ubuntu 10.04. Install uuid-ossp, set search_path, and insert UUIDs without errors. Try it now!

How can I generate a UUID in PostgreSQL for an INSERT statement?
I tried using uuid_generate_v4() but got the error:

ERROR:  function uuid_generate_v4() does not exist

I’m running PostgreSQL 8.4 on Ubuntu 10.04 x64. What steps do I need to take to enable UUID generation and use it in an INSERT?

Example of the failing statement:

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

You need to load the uuid-ossp extension (which ships with PostgreSQL 8.4) and make sure the function is visible in the current search path before you can call uuid_generate_v4() in an INSERT.


## Содержание


Установка пакета postgresql-contrib

PostgreSQL 8.4 поставляется в Ubuntu 10.04 как два пакета: postgresql-8.4 и postgresql-contrib-8.4. uuid_ossp находится в пакете contrib, поэтому его нужно установить, если ещё не установлен, на самом деле.

bash
sudo apt-get update
sudo apt-get install postgresql-contrib-8.4

См. официальную документацию PostgreSQL 8.4 по uuid-ossp
PostgreSQL 8.4: uuid-ossp

После установки пакета вы можете подключиться к базе данных и проверить, что модуль доступен, на самом деле.


Создание расширения uuid-ossp

Подключитесь к нужной базе данных (например, mydb) и выполните:

sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Если вы хотите разместить функции в отдельной схеме, например, в том числе uuid, используйте:

sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA uuid;

Справка по команде CREATE EXTENSION
PostgreSQL 8.4: CREATE EXTENSION

После выполнения вы увидите запись о расширении в pg_extension, на самом деле:

sql
SELECT * FROM pg_extension WHERE extname = 'uuid-ossp';

Проверка наличия функции и настройки поискового пути

  1. Проверка существования функции
sql
SELECT proname FROM pg_proc WHERE proname = 'uuid_generate_v4';

Если результат пустой, функция не была создана. Убедитесь, что вы выполнили CREATE EXTENSION в той же базе, на самом деле.

  1. Проверка search_path
sql
SHOW search_path;

Для того чтобы uuid_generate_v4() находилась без указания схемы, public (или схема, где находится расширение) должна быть в search_path. Если путь пустой (''), добавьте public:

sql
SET search_path = public, uuid;  -- если вы создали схему uuid

Вы также можете изменить путь глобально в postgresql.conf:

search_path = public, uuid

Проблемы с search_path и функции uuid_generate_v4()
Stack Overflow: uuid_generate_v4 does not exist


Использование функции в операторе INSERT

Если расширение находится в схеме public (стандартное расположение), ваш исходный запрос будет работать без изменений:

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

Если вы разместили расширение в схеме uuid, укажите схему явно:

sql
INSERT INTO items VALUES (
  uuid.uuid_generate_v4(),
  54.321,
  31,
  'desc 1',
  31.94
);

Обратите внимание, что тип колонки id должен быть uuid:

sql
CREATE TABLE items (
  id uuid PRIMARY KEY,
  price numeric,
  qty integer,
  description text,
  weight numeric
);

Обычные ошибки и их устранение

Ошибка Причина Как исправить
ERROR: function uuid_generate_v4() does not exist Расширение не было создано, либо путь search_path не содержит схему с функцией Создайте расширение (CREATE EXTENSION) и убедитесь, что public (или ваша схема) в search_path.
ERROR: function uuid_generate_v4() does not exist при наличии расширения Путь search_path пустой ('') Добавьте public в search_path (SET search_path = public).
Функция создаётся, но в SELECT возвращает ошибку Версия PostgreSQL слишком старая (до 8.4) Обновитесь до 8.4+ или используйте альтернативу gen_random_uuid() в более новых версиях.

Альтернативы и будущие версии PostgreSQL

  • Начиная с PostgreSQL 14 функция gen_random_uuid() встроена в ядро, и расширение uuid-ossp не требуется.
    См. документацию
    PostgreSQL 14: gen_random_uuid()

  • Если вы не можете обновить PostgreSQL и хотите избежать расширений, можно использовать сторонние библиотеки (например, pgcrypto), но они не предоставляют UUID‑генерацию по умолчанию.


Заключение

  1. Установите пакет postgresql-contrib-8.4.
  2. Создайте расширение uuid-ossp в нужной схеме (public по умолчанию).
  3. Убедитесь, что схема с функцией находится в search_path.
  4. В INSERT вызывайте uuid_generate_v4() (или uuid.uuid_generate_v4() при другой схеме).
  5. Если будете обновлять PostgreSQL, рассмотрите встроенную функцию gen_random_uuid().

Таким образом, после выполнения приведённых шагов вы сможете генерировать UUID и использовать их в INSERT без ошибок, на самом деле.

Авторы
Проверено модерацией
Модерация