首页 > 解决方案 > PostgreSQL:更改选择查询返回的所有表

问题描述

我在 postgres 11.2 db 上运行此查询:

SELECT relname
FROM pg_stat_user_tables
WHERE n_mod_since_analyze=0 AND relname LIKE '%' 
    AND relname NOT IN (SELECT relname FROM pg_class WHERE  array_length(reloptions,1)>0);

这将返回我需要禁用自动清理的表列表。我试图想出一种方法来ALTER TABLE pg_stat_user_tables.relname SET (autovacuum_enabled = false);在我的查询语句返回的所有表上运行。谷歌搜索不断让我回到更改表格列。是否可以只获取从此查询返回的表名并将其传递给 ALTER TABLE?

标签: postgresqlpostgresql-11

解决方案


尝试使用 psql CLI 和 \gexec 内部命令:

SELECT format('ALTER TABLE %s SET (autovacuum_enabled = false);',lt.relname)
FROM
(
 SELECT relname
 FROM pg_stat_user_tables
 WHERE n_mod_since_analyze=0 
 AND relname LIKE '%' 
 AND relname NOT IN (SELECT relname FROM pg_class WHERE  array_length(reloptions,1)>0)
) lt;
\gexec

执行输出:

ALTER TABLE p SET (autovacuum_enabled = false);
ALTER TABLE
ALTER TABLE t1 SET (autovacuum_enabled = false);
ALTER TABLE
ALTER TABLE t2 SET (autovacuum_enabled = false);
ALTER TABLE

推荐阅读