【问题标题】:How to find and delete some tables from PostgreSQL Database如何从 PostgreSQL 数据库中查找和删除一些表
【发布时间】:2014-08-25 17:48:11
【问题描述】:

在我的数据库中有 113 个表,

  • 例如我需要drop 名称为ilike '%gtab%' 的表

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    这将创建语句来删除所述表和与该模式匹配的其他对象。也没有系统表。

    SELECT 'DROP TABLE ' || c.oid::regclass || ';'
    FROM   pg_class c
    JOIN   pg_namespace n ON n.oid = c.relnamespace  -- to restrict to a schema
    WHERE  c.relkind = 'r'                           -- only tables
    AND    c.relname ILIKE '%gtab%'                  -- pattern for table names
    AND    n.nspname = 'public'                      -- restrict to a schema
    ORDER  BY 1;
    

    转换为 regclass 会根据需要自动转义和模式限定表名,并且可以安全地防止 SQL 注入。详情:

    对于很多表,单个集成语句会更快:

    SELECT 'DROP TABLE ' || string_agg(c.oid::regclass::text, ', ') || ';'
    FROM   pg_class c
    JOIN   pg_namespace n ON n.oid = c.relnamespace
    WHERE  c.relkind = 'r'
    AND    c.relname ILIKE '%gtab%'
    AND    n.nspname = 'public'
    ORDER  BY 1;
    

    结果:

    DROP TABLE tbl1, tbl2, schema1.tbl3;
    

    相关答案:

    【讨论】:

      【解决方案2】:
      • 获取名称为gtab的表

         select relname from pg_class where relname ilike '%gtab%'  and relname not ilike 
         '%seq%' and    relname not ilike  '%pkey%' and relname not ilike  '%idx%'
        
      • 如果您想获取drop query,只需使用COPY 函数导出到.CSV 文件,然后从导出的csv 文件中复制您的所有drop 查询和execute 它为pgScript

        copy (select 'drop table  ' || relname || ' cascade;' from pg_class where relname  
        ilike '%gtab%'  and relname not ilike  '%seq%'and relname not ilike  '%pkey%' and 
        relname  not ilike  '%idx%' ) to'D:\DropScript.csv' with csv header
        

      【讨论】:

      • 我需要从导出的文件中复制整个脚本并将其粘贴到pgAdmin 并作为pgScript 运行吗???
      • @user3744752 完全正确!!
      • 只是一个建议,而不是使用COPY 尝试将其作为一个函数
      • @user3744752:你确实不需要为此需要pgScript
      【解决方案3】:

      你可以在loop:

      t=# begin;
      BEGIN
      t=# do
      t-# $$
      t$# declare r record;
      t$# begin
      t$# for r in (select schemaname||'.'||tablename tn from pg_tables where tablename like '%gtab%') loop
      t$#   raise info '%','dropping '||r.tn;
      t$#   execute CONCAT('DROP TABLE '||r.tn);
      t$# end loop;
      t$# end;
      t$# $$
      t-# ;
      INFO:  dropping public.agtab
      INFO:  dropping public.bgtabb
      DO
      t=# rollback;
      ROLLBACK
      

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 2012-09-17
        • 2018-03-13
        • 2012-07-08
        • 2021-09-20
        • 2011-03-20
        • 2020-12-27
        • 2013-02-12
        • 1970-01-01
        相关资源
        最近更新 更多