PostgreSQL | Как получить следующее значение существующего идентификатора?

PostgreSQL | Как получить следующее значение существующего идентификатора?

Какой первичный ключ таблицы является «следующим» для «текущего» в 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-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Команды SQLhttps://postgrespro.ru/docs/postgresql/15/sql-commands

Команда CREATE FUNCTIONhttps://postgrespro.ru/docs/postgresql/15/sql-createfunction

Команда CREATE SEQUENCEhttps://postgrespro.ru/docs/postgresql/15/sql-createsequence

Информация для оптимизации функций — https://postgrespro.ru/docs/postgresql/15/xfunc-optimization

Категории изменчивости функций — https://postgrespro.ru/docs/postgresql/15/xfunc-volatility