截断 Postgres 中除列表中提供的表之外的所有表

Lui*_* E. 1 postgresql truncate dynamic-sql

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

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;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ERROR:  syntax error at or near "TRUNCATE"
LINE 9: TRUNCATE TABLE (SELECT table_name FROM tables_to_be_truncated...
Run Code Online (Sandbox Code Playgroud)

我确实有权截断表,并且当我运行单个表时,TRUNCATE TABLE access_tokens它工作得很好。

我也尝试过这个

ERROR:  syntax error at or near "TRUNCATE"
LINE 9: TRUNCATE TABLE (SELECT table_name FROM tables_to_be_truncated...
Run Code Online (Sandbox Code Playgroud)

但效果不太好。

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

Jim*_*nes 6

你不需要为此的函数。一个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;
$$;
Run Code Online (Sandbox Code Playgroud)

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

演示:db<>fiddle

  • @路易斯E。没问题..快乐编码:) (2认同)