截断 Postgres 中的所有表,列表中提供的表除外
truncate all tables in Postgres except for the ones provided in a list
我想在保持序列同一性的同时对整个数据库进行分类。我想到了这样的事情:
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...
我确实有权 运行 分类 table 并且当我 运行 像 TRUNCATE TABLE access_tokens
这样的单个 table 时它工作正常.
我也试过这个
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
我想在保持序列同一性的同时对整个数据库进行分类。我想到了这样的事情:
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...
我确实有权 运行 分类 table 并且当我 运行 像 TRUNCATE TABLE access_tokens
这样的单个 table 时它工作正常.
我也试过这个
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