Использование результата выбора внутри оператора alter table в postgres - PullRequest
2 голосов
/ 19 января 2020

У меня есть таблица postgres, определенная следующим образом:

CREATE TABLE public.Table_1
(
  id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 
  START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 )
) 

Из-за миграции данных столбец id испорчен, и значение для id, которое генерируется в INSERT, не является уникальным. Следовательно, мне нужно сбросить столбец идентификатора, как показано ниже

SELECT MAX(id) + 1 From Table_1;
ALTER TABLE Table_1 ALTER COLUMN id RESTART WITH 935074;

Прямо сейчас я запускаю первый запрос, чтобы получить значение Max (id) + 1, а затем мне нужно заменить его в запросе ALTER. Есть ли способ сохранить результат SELECT и просто использовать переменную внутри инструкции ALTER?

1 Ответ

1 голос
/ 19 января 2020

Вот один из способов сделать это:

select setval(pg_get_serial_sequence('Table_1', 'id'), coalesce(max(id),0) + 1, false) 
from Table_1;

Обоснование:

  • pg_get_serial_sequence() возвращает имя последовательности для данной таблицы и столбца
  • set_val() можно использовать для сброса последовательности
  • . Это можно заключить в select, который дает вам текущее максимальное значение id в таблице (или 1, если таблица пуста)
...