В этой заметке описывается процесс миграции с 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
Автор::

Дополнительные материалы

Дочерние заметки