代码之家  ›  专栏  ›  技术社区  ›  Elshan

从Postgres SQL中删除所选表

  •  0
  • Elshan  · 技术社区  · 6 年前

    我需要从 后置SQL . 最好用一下 like where 条款。

    像我一样

    TABLE_A
    TABLE_B
    TABLE_C
    -
    -
    -
    TABLE_N
    

    我需要删除

    TABLE_A to TABLE_X
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Abdel P.    6 年前
    DO
    $$
    DECLARE
       r RECORD;
    BEGIN
        FOR r IN SELECT oid::REGCLASS table_name
                 FROM pg_class
                 WHERE relname <= 'table_x'
                 AND relkind = 'r'
        LOOP
              EXECUTE 'DROP TABLE' || r.table_name;
        END LOOP;
    END;
    $$ LANGUAGE plpgsql;
    
        2
  •  2
  •   Erwin Brandstetter    6 年前

    可以用一个命令来完成,这会更快——以防这是一个循环任务。

    添加 IF EXISTS 如果任何表的存在是不确定的。这样我们就可以节省额外的系统目录( information_schema.tables pg_catalog.pg_tables )
    你可能想增加 CASCADE 以下内容:

    DO
    $do$
    BEGIN
      -- child safety device: quote RAISE instead of EXECUTE to prime the bomb
      -- EXECUTE (
      RAISE NOTICE '%', (
         SELECT 'DROP TABLE IF EXISTS'
             || string_agg('table_' || chr(ascii('a') + g) , ', ')
             || ' CASCADE;'
         FROM   generate_series(0,13) g
         );
    END
    $do$;
    

    生成表单的命令:

    DROP TABLE IF EXISTS table_a, table_b, ... , table_n CASCADE;
    

    使用 generate_series() 生成请求的表名。更多信息:

        3
  •  0
  •   Elshan    6 年前

    我从@abdel得到了一些想法,并为想要这个的用户做了这个。

    DO
    $$
    DECLARE
       r RECORD;
    BEGIN
        FOR r IN SELECT table_name
                 FROM information_schema.tables
                 WHERE table_schema = 'public' AND table_name like 'YOUR_LIKE_QURY_GOES_HERE'
        LOOP
               EXECUTE 'DROP TABLE ' || r.table_name;
        END LOOP;
    END;
    $$ LANGUAGE plpgsql;