如何在一个操作中更改多个PostgreSQL表的模式?

Rya*_*ton 23 postgresql schema migrate postgresql-9.1

我有一个PostgreSQL 9.1数据库,其中包含100个左右的表,这些表被加载到"公共"模式中.我想将这些表(但不是'public'中的所有函数)移动到'data'模式.

我知道我可以使用以下内容一次移动1个表.

ALTER TABLE [tablename] SET SCHEMA [new_schema]
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ens 47

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;
$$;
Run Code Online (Sandbox Code Playgroud)

  • 你也可能想要序列:DO $$ DECLARE行记录; BEGIN FOR行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];'; 结束循环; 结束; $$; (3认同)
  • 您也可以使用以下命令移动函数:`DO $$ DECLARE行记录; sql text = E'\n'; BEGIN FOR行IN选择proname :: text作为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];'); 结束循环; EXECUTE sql; END; $$;` (2认同)