【问题标题】:truncate all tables in Postgres except for the ones provided in a list截断 Postgres 中的所有表,列表中提供的表除外
【发布时间】:2021-10-03 09:00:19
【问题描述】:

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

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

效果也不好。

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

【问题讨论】:

  • 您需要动态 SQL。 TRUNCATE 语法仅支持静态表名列表,不支持查询。

标签: postgresql dynamic-sql truncate


【解决方案1】:

你不需要一个函数。 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

【讨论】:

  • 太棒了!这就是我一直在寻找的。谢谢!
  • 是的,刚刚做了,因为 SO 冷却时间,不能早点接受 :)
  • @LuizE。没问题..快乐编码:)
猜你喜欢
  • 2011-02-19
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
相关资源
最近更新 更多