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:
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 - Создание расширения
uuid-ossp - Проверка наличия функции и настройки поискового пути
- Использование функции в операторе
INSERT - Обычные ошибки и их устранение
- Альтернативы и будущие версии PostgreSQL
Установка пакета postgresql-contrib
PostgreSQL 8.4 поставляется в Ubuntu 10.04 как два пакета: postgresql-8.4 и postgresql-contrib-8.4. uuid_ossp находится в пакете contrib, поэтому его нужно установить, если ещё не установлен, на самом деле.
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) и выполните:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Если вы хотите разместить функции в отдельной схеме, например, в том числе uuid, используйте:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA uuid;
Справка по команде
CREATE EXTENSION
PostgreSQL 8.4: CREATE EXTENSION
После выполнения вы увидите запись о расширении в pg_extension, на самом деле:
SELECT * FROM pg_extension WHERE extname = 'uuid-ossp';
Проверка наличия функции и настройки поискового пути
- Проверка существования функции
SELECT proname FROM pg_proc WHERE proname = 'uuid_generate_v4';
Если результат пустой, функция не была создана. Убедитесь, что вы выполнили CREATE EXTENSION в той же базе, на самом деле.
- Проверка
search_path
SHOW search_path;
Для того чтобы uuid_generate_v4() находилась без указания схемы, public (или схема, где находится расширение) должна быть в search_path. Если путь пустой (''), добавьте public:
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 (стандартное расположение), ваш исходный запрос будет работать без изменений:
INSERT INTO items VALUES (
uuid_generate_v4(),
54.321,
31,
'desc 1',
31.94
);
Если вы разместили расширение в схеме uuid, укажите схему явно:
INSERT INTO items VALUES (
uuid.uuid_generate_v4(),
54.321,
31,
'desc 1',
31.94
);
Обратите внимание, что тип колонки id должен быть uuid:
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‑генерацию по умолчанию.
Заключение
- Установите пакет
postgresql-contrib-8.4. - Создайте расширение
uuid-osspв нужной схеме (publicпо умолчанию). - Убедитесь, что схема с функцией находится в
search_path. - В
INSERTвызывайтеuuid_generate_v4()(илиuuid.uuid_generate_v4()при другой схеме). - Если будете обновлять PostgreSQL, рассмотрите встроенную функцию
gen_random_uuid().
Таким образом, после выполнения приведённых шагов вы сможете генерировать UUID и использовать их в INSERT без ошибок, на самом деле.