@shutroman

Как написать sql-скрипт, который пройдет по всем таблицам всей БД и изменит поле row_num с varchar(10) на int4 и сделает его not null?

Вся суть в вопросе
БД- Postgresql
Язык - SQL
Я понимаю, что нужно написать цикл, который перебирает каждую таблицу, меняет тип данных на инт4 и если нулл попадается, то на нот нулл меняет, но не понимаю какие команды применить и как лучше записать. Подходит ли данный код?:
DO $ $ BEGIN EXECUTE (
  SELECT
    string_agg(
      format(
        'ALTER TABLE %I ALTER COLUMN row_num TYPE int4 NOT NULL',
        tablename
      ),
      E '\n'
    )
  FROM
    pg_tables
  WHERE
    schemaname = 'public'
) || ';';
END $ $;
  • Вопрос задан
  • 154 просмотра
Пригласить эксперта
Ответы на вопрос 2
Wispik
@Wispik
вот посмотри
Там написано, как циклом по всём таблицам пройтись
Ответ написан
Комментировать
@galaxy
Запрос на изменение типа должен быть примерно такой (и обратите внимание на точку с запятой в конце запроса):
alter table %I alter column row_num type int4 using row_num::int, alter column row_num set not null;

(если где-то будут NULL'ы или row_num не влезет/не сконвертируется в int, будут проблемы).

В скрипте DO $ $ BEGIN EXECUTE ( - лишнее, это же просто SELECT.
Либо, если вы не хотите копировать вывод запроса и отдельно выполнять, можно таким скриптом:
DO $$DECLARE q TEXT;
BEGIN
    FOR q IN SELECT format(
                        'alter table %I alter column row_num type int4 using row_num::int, alter column row_num set not null',
                        tablename
                      )
               FROM pg_tables WHERE schemaname = 'public'
    LOOP
        EXECUTE q;
    END LOOP;
END$$;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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