是否可以使用通配符截断和级联表?
SELECT format('TRUNCATE TABLE %I CASCADE;', tablename)
FROM pg_tables WHERE tableowner = 'XXX';
如果将其包装在匿名代码块中并添加循环,则可以:
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;
$$;
另外(如上所述),我添加模式名称只是为了避免任何潜在的意外后果。
通过这种方式,您可以获得一个包含所有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;
$$;