В этой заметке описывается процесс миграции с UUID на Автоинкремент в БД
Подготовка и анализ зависимостей
- Нет ли в других таблицах внешних ключей (FK), ссылающихся на старую колонку UUID.
- Проверьте код приложения, API, скрипты: не используют ли они явным образом старый тип ключа или его формат.
Создание нового столбца
- Создайте новую колонку с типом
BIGINT
(илиBIGSERIAL
, если используете PostgreSQL). - Если требуется, создайте последовательность:
CREATE SEQUENCE your_table_id_seq;
Назначьте этой колонке DEFAULT
, чтобы при вставке новых данных значение генерировалось автоматически:
ALTER TABLE your_table
ALTER COLUMN temp_id SET DEFAULT nextval('your_table_id_seq');
Сделайте колонку NOT NULL
(если уверены, что в ней не должно быть пропусков):
ALTER TABLE your_table
ALTER COLUMN temp_id SET NOT NULL;
Заполнение новой колонки (бэкфил). Обновите существующие записи, чтобы у каждой строки появилось уникальное значение:
UPDATE your_table
SET temp_id = nextval('your_table_id_seq');
WARNING
Если важен порядок (например, по дате создания), можно использовать более сложный запрос с сортировкой.
Переключение на новый ключ
- Удалите внешние ключи, если они указывали на старую колонку-ключ.
- Удалите или переименуйте старую колонку:
ALTER TABLE your_table DROP COLUMN old_uuid_column;
или:
ALTER TABLE your_table RENAME COLUMN old_uuid_column TO uuid_backup;
Переименуйте temp_id
в id
:
ALTER TABLE your_table
RENAME COLUMN temp_id TO id;
Добавьте первичный ключ:
ALTER TABLE your_table
ADD CONSTRAINT your_table_pkey PRIMARY KEY (id);
- Если были внешние ключи, которые ссылаются на старый UUID, обновите их или добавьте новые, ссылающиеся на новую колонку.
- Проверьте код приложения: там, где раньше ожидался UUID, теперь будет число. При необходимости скорректируйте схемы, DTO, сервисы и т. п.
Пример миграции с Liquibase
Добавление нового столбца с автоинкрементом
<changeSet id="1" author="dev">
<addColumn tableName="your_table">
<column name="temp_id" type="BIGINT" autoIncrement="true"/>
</addColumn>
</changeSet>
Заполнение нового столбца значениями
<changeSet id="2" author="dev">
<sql>UPDATE your_table SET temp_id = nextval('your_table_id_seq');</sql>
</changeSet>
Удаление старого UUID и установка нового первичного ключа
<changeSet id="3" author="dev">
<dropPrimaryKey tableName="your_table" constraintName="your_table_pkey"/>
<dropColumn tableName="your_table" columnName="old_uuid_column"/>
<renameColumn tableName="your_table" oldColumnName="temp_id" newColumnName="id"/>
<addPrimaryKey tableName="your_table" columnNames="id" constraintName="your_table_pkey"/>
</changeSet>
Мета информация
Область:: 00 Реляционная база данных
Родитель::
Источник::
Создана:: 2025-02-18
Автор::