如何将所有表从一个 Postgres 模式移动到另一个

Tac*_*ons 7 schema postgresql alter-table

我想将所有表从架构移动xyz到默认架构public

我可以移动单个表

ALTER TABLE table_name
    SET SCHEMA public;
Run Code Online (Sandbox Code Playgroud)

我可以得到所有的桌子

SELECT table_name FROM information_schema.tables WHERE table_schema='xyz'
Run Code Online (Sandbox Code Playgroud)

有没有办法将这两者结合在一起?

Lau*_*lbe 5

DO语句中使用 PL/pgSQL :

DO
$$DECLARE
   p_table regclass;
BEGIN
   SET LOCAL search_path='xyz';
   FOR p_table IN
      SELECT oid FROM pg_class
      WHERE relnamespace = 'xyz'::regnamespace
        AND relkind = 'r'
   LOOP
      EXECUTE format('ALTER TABLE %s SET SCHEMA public', p_table);
   END LOOP;
END;$$;
Run Code Online (Sandbox Code Playgroud)


Sah*_*sci 5

Laurenz 's Answer的改进版本;

DO LANGUAGE plpgsql
$body$
DECLARE
   l_old_schema NAME = 'old_schema';
   l_new_schema NAME = 'new_schema';
   l_sql TEXT;
BEGIN
  FOR l_sql IN
    SELECT 
        format('ALTER TABLE %I.%I SET SCHEMA %I', n.nspname, c.relname, l_new_schema)
      FROM pg_class c
      JOIN pg_namespace n ON n.oid = c.relnamespace
      WHERE
        n.nspname = l_old_schema AND
        c.relkind = 'r'
  LOOP
    RAISE NOTICE 'appliying %', l_sql;
    EXECUTE l_sql;
  END LOOP;
END;
$body$;
Run Code Online (Sandbox Code Playgroud)