Сжать или перенумеровать идентификаторы для всех таблиц и сбросить последовательности на max (id)?

После долгой работы у меня появляется все больше и больше дыр в поле id. Идентификатор некоторых таблиц - int32, а последовательность идентификаторов достигает максимального значения. Некоторые источники Java доступны только для чтения, поэтому я не могу просто изменить тип столбца id с int32 на long , что нарушит работу API.

Я хотел бы перенумеровать их все. Это может быть плохой практикой, но хороший или плохой не имеет отношения к этому вопросу. Я хочу изменить нумерацию, в частности, таких очень длинных идентификаторов, как «61789238», «548273826529524324». Я не знаю, почему они такие длинные, но более короткие идентификаторы также легче обрабатывать вручную.

Но сложно сжать идентификаторы вручную из-за ссылок и ограничений.

Поддерживает ли сам PostgreSQL перенумерацию идентификаторов? Или есть какой-нибудь плагин или служебная программа для этой работы?

Может, я могу написать какие-нибудь хранимые процедуры? Было бы здорово, если бы я мог планировать его раз в год.

10
задан Machavity 9 April 2018 в 21:53
поделиться

1 ответ

Так как мне не нравились ответы, я записал функцию в PL/pgSQL, чтобы сделать задание. Это называют как это:

=> SELECT resequence('port','id','port_id_seq');
 resequence   
--------------
 5090 -> 3919

Берет 3 параметра

  1. название названия таблицы
  2. столбца, который является ПОСЛЕДОВАТЕЛЕН
  3. название последовательности, которую СЕРИАЛ использует

, функция возвращает краткий отчет о том, что это сделало с предыдущим значением последовательности и нового значения.

функциональные ЦИКЛЫ по таблице ORDERed именованным столбцом и делает ОБНОВЛЕНИЕ для каждой строки. Затем устанавливает новое значение для последовательности. Вот именно.

  1. порядок значений сохраняется.
  2. Никакое Добавление и ОТБРАСЫВАНИЕ временных столбцов или таблиц не включены.
  3. No ОТБРАСЫВАНИЕ и Добавление ограничений и внешних ключей необходим.
  4. , Конечно, у Вас лучше есть КАСКАД ON UPDATE для тех внешних ключей.

код:

CREATE OR REPLACE FUNCTION resequence(_tbl TEXT, _clm TEXT, _seq TEXT) RETURNS TEXT AS $FUNC$
DECLARE                                            
        _old BIGINT;_new BIGINT := 0;              
BEGIN
        FOR _old IN EXECUTE 'SELECT '||_clm||' FROM '||_tbl||' ORDER BY '||_clm LOOP
                _new=_new+1;
                EXECUTE 'UPDATE '||_tbl||' SET '||_clm||'='||_new||' WHERE '||_clm||'='||_old;
        END LOOP;
        RETURN (nextval(_seq::regclass)-1)||' -> '||setval(_seq::regclass,_new);
END $FUNC$ LANGUAGE plpgsql;
1
ответ дан 3 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: