如何在一次操作中更改多个 PostgreSQL 表的架构?

Posted

技术标签:

【中文标题】如何在一次操作中更改多个 PostgreSQL 表的架构?【英文标题】:How to change schema of multiple PostgreSQL tables in one operation? 【发布时间】:2012-04-30 10:02:05 【问题描述】:

我有一个 PostgreSQL 9.1 数据库,其中包含 100 个左右的表,这些表已加载到“公共”模式中。我想将这些表(但不是“公共”中的所有函数)移动到“数据”模式。

我知道我可以使用以下内容一次移动 1 张桌子。

ALTER TABLE [tablename] SET SCHEMA [new_schema]

是否可以在一次操作中将所有表移动到新架构?如果是这样,完成这项任务的最有效方法是什么?

【问题讨论】:

【参考方案1】:

DO 可以解决问题:

DO
$$
DECLARE
    row record;
BEGIN
    FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' -- and other conditions, if needed
    LOOP
        EXECUTE 'ALTER TABLE public.' || quote_ident(row.tablename) || ' SET SCHEMA [new_schema];';
    END LOOP;
END;
$$;

【讨论】:

听起来和我想象的一模一样。由于我是 postgres 的新手,我应该在哪里运行它?我在 pgAdmin 3 (windows) 和 psql 命令行中进行了尝试,但在这两种情况下都出现了错误。感谢您的帮助! 它只是一段 SQL,就像在您最喜欢的 SQL 客户端中的任何查询一样运行它。你可以使用 psql、pgAdmin3 或类似的东西。 我从 pgAdmin3 得到的错误是:“错误:类型“quote_ident”不存在。SQL 状态:42704。上下文:PL/pgSQL 函数“inline_code_block”在 EXECUTE 语句的第 5 行。”跨度> 你也可以移动你的函数:DO$$ DECLARE row record; sql text = E'\n'; BEGIN FOR row IN select proname::text as proname, pg_get_function_identity_arguments(p.oid) AS params from pg_proc p JOIN pg_type t on p.prorettype = t.oid JOIN pg_namespace n on n.oid = p.pronamespace LEFT JOIN pg_description d on p.oid = d.objoid WHERE nspname = 'public' LOOP sql = CONCAT(sql, E'\n', 'ALTER FUNCTION public.', row.proname, '(', row.params, ') SET schema [new_schema];'); END LOOP; EXECUTE sql; END;$$; 你可能也想要这些序列:DO $$ DECLARE row record; BEGIN FOR row IN SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public' LOOP EXECUTE 'ALTER SEQUENCE public。' || quote_ident(row.sequence_name) || ' SET SCHEMA [new_schema];';结束循环;结尾; $$;

以上是关于如何在一次操作中更改多个 PostgreSQL 表的架构?的主要内容,如果未能解决你的问题,请参考以下文章

在一次操作中更改元素属性(数据集) - 避免回流

如何在mysql中一次更改多个表?

如何同时操作多个工作表

如何在一次调用中释放多个互斥锁

如何在颤动中使用 page_transition 在一次后按中返回多个页面

PostgreSQL PG序列 与 序列是否可以绑定到多个表的疑问