如何一次将 NOT NULL 设置为存在于我的数据库的所有表中的列?

How to set NOT NULL to a column present in all the tables of my database at once?

我正在使用 PostgreSQL。我必须在数据库的所有 table 中存在的列上设置 NOT NULL 属性。 我知道如何设置一个 table,使用:

ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;

但是我的数据库中有大约 400 个 table,所以我需要一些东西来立即完成,有人在路上吗?

提前致谢!

使用psql\gexec:

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

或者,您可以 运行 语句,将输出保存到脚本并执行。

您还可以使用 PL/pgSQL 代码编写 DO 语句,循环查询结果并使用 EXECUTE 作为动态 SQL 执行它们。

正如 laurenz 所说,您可以通过在 DO 语句中执行 ALTER 命令来实现它,如下所示,

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;
$$;