Как установить NOT NULL для столбца, присутствующего во всех таблицах моей базы данных одновременно?

Я работаю с PostgreSQL. Я должен установить свойство NOT NULL для столбца, который существует во всех таблицах моей базы данных. Я знаю, как установить в одной таблице, используя:

ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;

Но у меня в базе данных около 400 таблиц, поэтому мне нужно что-то сделать сразу, кто-нибудь подскажет?

Заранее спасибо!


person La Rosalia    schedule 30.06.2020    source источник
comment
Я не знаком с Postgres, но если вы можете запустить команду для получения имен таблиц (например, stackoverflow.com/questions/14730228/ ), затем вы можете просто вставить их в Excel и использовать там формулу, чтобы иметь строку для каждой таблицы, которая включает каждое имя таблицы, чтобы сделать оператор SQL.   -  person d219    schedule 30.06.2020


Ответы (2)


Как заявил Лоренц, вы можете добиться этого, выполнив команды ALTER в операторе DO, как показано ниже:

DO $$
DECLARE
    selectrow record;
BEGIN
    FOR selectrow IN
        SELECT format(
                  'ALTER TABLE %I.%I ALTER %s SET NOT NULL;',
                  table_schema,
                  table_name,
                  'my_column'
               ) AS script
        FROM information_schema.tables
        WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
    LOOP
        EXECUTE selectrow.script
    END LOOP;
END;
$$;
person Vivek S.    schedule 30.06.2020

Используйте \gexec psql:

SELECT format(
          'ALTER TABLE %I.%I ALTER column_name SET NOT NULL;',
          table_schema,
          table_name
       )
FROM information_schema.tables
WHERE table_schema NOT IN ('pg_catalog', 'information_schema') \gexec

Кроме того, вы можете запустить оператор, сохранить вывод в скрипт и выполнить его.

Вы также можете написать оператор DO с кодом PL/pgSQL, который перебирает результаты запроса и использует EXECUTE для их выполнения как динамический SQL.

person Laurenz Albe    schedule 30.06.2020