Какой первичный ключ таблицы является «следующим» для «текущего» в PostgreSQL?
Очень часто приложения (сайты) с клиентской стороны требуют формирования страниц пагинаций или кнопок «следующая страница» / «предыдущая страница». Как правило они оформляются с адресами, в которые входит значение текущего идентификатора. Это число (первичный ключ) берётся из таблицы и просто транслируется в адрес под определённый фрагмент пути.
Так вот при активной работе с базой данных записи из таблиц могут удаляться, а их значения первичных ключей будут просто исчезать навсегда. В итоге первичные ключи станут не последовательными. В списке ключей появятся «дырки». В результате эти «дырки» нужно как-то перепрыгивать и получать реальные значения существующего ключа.
Пример SQL-запроса, который вернёт следующую актуальную запись для идентификатора 4000000:
SELECT id FROM t_scheme.t_name WHERE id > 4000000 ORDER BY id ASC LIMIT 1; или SELECT * FROM t_scheme.t_name WHERE id > 4000000 ORDER BY id ASC LIMIT 1;
Здесь очень важно обратить внимание на предложение «ASC» — это порядок сортировки. Для получения «следующего» идентификатора он обязателен.
Вариант со звёздочкой «*» или с «id» влияет на то, каким образом будет прочитан индекс.
Логика подробно описана в похожей по смыслу публикации — PostgreSQL | Как получить предыдущее значение существующего идентификатора?
Здесь у нас схема данных называется «t_scheme«, а таблица называется «t_name «.
Функция для получения следующего существующего значения целочисленного идентификатора по заданному значению
CREATE OR REPLACE FUNCTION a.get_next_id_from_t_d(x_id bigint) RETURNS bigint LANGUAGE 'plpgsql' COST 100 IMMUTABLE PARALLEL UNSAFE AS $BODY$ DECLARE -- DROP FUNCTION a.get_prev_id_from_t_d(x_id bigint); BEGIN RETURN (SELECT id FROM a.t_d WHERE id > x_id ORDER BY id ASC LIMIT 1); END; $BODY$;
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Команды SQL — https://postgrespro.ru/docs/postgresql/15/sql-commands
Команда CREATE FUNCTION — https://postgrespro.ru/docs/postgresql/15/sql-createfunction
Команда CREATE SEQUENCE — https://postgrespro.ru/docs/postgresql/15/sql-createsequence
Информация для оптимизации функций — https://postgrespro.ru/docs/postgresql/15/xfunc-optimization
Категории изменчивости функций — https://postgrespro.ru/docs/postgresql/15/xfunc-volatility