如何在Postgresql中删除所有表而不删除模式?

11

我已经被分配了一个模式,但我没有权限删除它。有没有一种简单的方法来删除模式中的每个表、数据和所有内容,使其就像我刚创建时一样。

drop schema jason cascade;
create schema jason;

但是不实际删除模式。


我想最好的方法是从information_schema.tables生成DROP TABLE语句列表,然后一次性运行它们。 - Ispirer SQLWays Migrations
2个回答

17

接受的答案很好,但您可以利用匿名块(PosgreSQL 9.0+)一步完成此操作:

DO $$
DECLARE 
    r record;
BEGIN
    FOR r IN SELECT quote_ident(tablename) AS tablename, quote_ident(schemaname) AS schemaname FROM pg_tables WHERE schemaname = 'public'
    LOOP
        RAISE INFO 'Dropping table %.%', r.schemaname, r.tablename;
        EXECUTE format('DROP TABLE IF EXISTS %I.%I CASCADE', r.schemaname, r.tablename);
    END LOOP;
END$$;

9

请在psql中尝试以下操作:

-- Turn off headers:
\t
-- Use SQL to build SQL:
select 'drop table if exists "' || tablename || '" cascade;' 
  from pg_tables
 where schemaname = 'jason'; 
-- If the output looks good, write it to a file and run it:
\g out.tmp
\i out.tmp

来源于stackoverflow.com/questions/3327312/drop-all-tables-in-postgresql

以下是需要翻译的内容:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
以上两个命令可以清空PostgreSQL数据库中的所有表格,但保留public schema。

1
我还想评论一下,这只是创建了一组命令,您需要在此之后运行它们以删除表。 - Encompass
是和否,是创建命令集并运行它们。 - Frank N Stein
替代方案:使用\gexec而不是\g和\i。 - Frank N Stein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接