如何一次将 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;
$$;
我正在使用 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;
$$;