После долгой работы у меня появляется все больше и больше дыр в поле id. Идентификатор некоторых таблиц - int32, а последовательность идентификаторов достигает максимального значения. Некоторые источники Java доступны только для чтения, поэтому я не могу просто изменить тип столбца id с int32
на long
, что нарушит работу API.
Я хотел бы перенумеровать их все. Это может быть плохой практикой, но хороший или плохой не имеет отношения к этому вопросу. Я хочу изменить нумерацию, в частности, таких очень длинных идентификаторов, как «61789238», «548273826529524324». Я не знаю, почему они такие длинные, но более короткие идентификаторы также легче обрабатывать вручную.
Но сложно сжать идентификаторы вручную из-за ссылок и ограничений.
Поддерживает ли сам PostgreSQL перенумерацию идентификаторов? Или есть какой-нибудь плагин или служебная программа для этой работы?
Может, я могу написать какие-нибудь хранимые процедуры? Было бы здорово, если бы я мог планировать его раз в год.
Так как мне не нравились ответы, я записал функцию в PL/pgSQL, чтобы сделать задание. Это называют как это:
=> SELECT resequence('port','id','port_id_seq');
resequence
--------------
5090 -> 3919
Берет 3 параметра
, функция возвращает краткий отчет о том, что это сделало с предыдущим значением последовательности и нового значения.
функциональные ЦИКЛЫ по таблице ORDERed именованным столбцом и делает ОБНОВЛЕНИЕ для каждой строки. Затем устанавливает новое значение для последовательности. Вот именно.
код:
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;