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)
有没有办法将这两者结合在一起?
在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)
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)