среда, 18 сентября 2019 г.

Альтернативный автоинкремент

Проблема

autoincrement поле в mysql всегда работает относительно максимального значения в таблице.

Пример

В таблице есть поле num, и 100 записей в таблице, где num идет непрерывно от 1 до 100. Нам нужно вставить в таблицу запись, где значение num нужно сделать, например 777, но при этом сохранить возможность автоматической вставки значений поля num, продолжая со 101. 
Автоинкремент в таком случае вставит значение 778.

Решение

Решение проблемы было доверено СУБД. Для этого:
  1. Был создан уникальный ключ для поля num
  2. Сделан before insert trigger для таблицы mytable

Тело триггера

BEGIN
IF NEW.num IS NULL
THEN
 SET    NEW.num := (SELECT t1.num + 1 AS empy.num
                    FROM mytable AS t1
                    LEFT JOIN mytable AS t2 ON t2.num = t1.num +1
                    WHERE t2.num IS NULL LIMIT 1);
END IF;
END