【问题标题】:postgresql truncate cascade tables with wildcardpostgresql 用通配符截断级联表
【发布时间】:2018-06-06 09:24:24
【问题描述】:

是否可以使用通配符截断和级联表?

SELECT format('TRUNCATE TABLE %I CASCADE;', tablename)
FROM   pg_tables WHERE tableowner = 'XXX';

【问题讨论】:

    标签: database postgresql wildcard truncate cascade


    【解决方案1】:

    如果你将它包装在一个匿名代码块中并添加一个循环,你可以:

    do $$
    
      declare
        tr pg_tables%rowtype;
      begin
        for tr in
          select * from pg_tables WHERE tableowner = 'XXX';
        loop
          execute format('TRUNCATE TABLE %I.%I CASCADE;', tr.schemaname, tr.tablename);
        end loop;
      end;
    
    $$;
    

    另外(如上所述),我会添加架构名称,以避免任何潜在的意外后果。

    【讨论】:

    • 如何执行此操作?我知道的唯一方法是进行查询。如何将此脚本引入我的数据库?
    • 正如@EmilioPlatzer 上面所说的,您可以像执行任何其他SQL 命令一样按原样执行它——来自psql、PgAdmin 或您通常执行SQL 的任何地方。试一试。
    【解决方案2】:

    通过这种方式,您可以获得一个包含所有 table_names 的 TRUNCATE TABLE,然后它们将被一起处理

    do $$
      declare
        names text;
        my_sql text;
      begin
        select string_agg(format('%I.%I', schemaname, tablename), ', ')
          into names
          from pg_tables 
          where tableowner = 'XXX';
        if names<>'' then
          my_sql = 'TRUNCATE TABLE '||names||' CASCADE';
          execute my_sql;
        end if;
      end;
    $$;
    

    【讨论】:

    • 如何执行此操作?我知道的唯一方法是进行查询。如何将此脚本引入我的数据库?
    • 这是一个查询。如果您可以编写 INSERT、DELETE 或 UPDATE,则可以编写 DO(除非您在禁止它的框架内工作)
    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多