微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

截断 Postgres 中的所有表,除了列表中提供的表

如何解决截断 Postgres 中的所有表,除了列表中提供的表

我想在保持序列标识的同时截断整个数据库。我想出了这样的事情:

WITH tables_to_be_truncated AS (
SELECT table_name
    FROM information_schema.tables
    WHERE table_type='BASE TABLE'
    AND table_schema='public'
    AND table_name NOT IN ('admins','admin_roles')
)
TruncATE TABLE (SELECT table_name FROM tables_to_be_truncated) CONTINUE IDENTITY RESTRICT;

我收到此错误

ERROR:  Syntax error at or near "TruncATE"
LINE 9: TruncATE TABLE (SELECT table_name FROM tables_to_be_truncated...

我确实有截断表的权限,当我运行像 TruncATE TABLE access_tokens 这样的单个表时,它工作正常。

我也试过这个

TruncATE TABLE (SELECT string_agg(table_name,',') FROM tables_to_be_truncated) CONTINUE IDENTITY RESTRICT

效果不佳。

从我在其他帖子中看到的情况来看,人们正在使用函数来做这件事。老实说,我不想走这条路,但如果这是唯一的方法......

解决方法

你不需要一个函数。 anonymous code block 可以:

DO $$
DECLARE row RECORD;
BEGIN
  FOR row IN SELECT table_name
    FROM information_schema.tables
    WHERE table_type='BASE TABLE'
    AND table_schema='public'
    AND table_name NOT IN ('admins','admin_roles') 
  LOOP 
    EXECUTE format('TRUNCATE TABLE %I CONTINUE IDENTITY RESTRICT;',row.table_name);
  END LOOP;
END;
$$;

除此之外,我认为您无法使用纯 SQL 运行动态查询。

演示:db<>fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。