我正在使用PostgreSQL,我尝试截断所有以'beach'
开头的表格
换句话说,我想做一些事情:
Truncate (SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public' AND table_name LIKE 'beach_%')
有什么想法吗?
答案 0 :(得分:1)
这是无效的语法。您不能将TRUNCATE
与子查询一起使用(请参阅doc)。此外,您可能需要a procedure遍历这些表并截断它们。
答案 1 :(得分:1)
首先阅读manual on TRUNCATE
,了解正确语法的说明。
接下来,您正在寻找动态SQL ,因为您无法在TRUNCATE
中对表名使用wilcards或模式。您需要动态编写SQL命令。您可以像建议的那样在两次往返服务器中执行此操作,或者您可以使用单个DO
语句:
DO
$do$
BEGIN
EXECUTE (
-- RAISE NOTICE '%', ( -- better check before you execute ..
SELECT 'TRUNCATE ' || string_agg(c.oid::regclass::text, ', ')
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname LIKE 'beach_%'
AND c.relkind = 'r'
AND n.nspname = 'public'
);
END
$do$;
创建并执行以下形式的命令:
TRUNCATE beach_foo, beach_bar, ...
您可能希望/必须在命令末尾添加CASCADE
。
相关答案:
DROP All Views PostgreSQL
考虑信息架构与系统目录之间的细微差别:
How to check if a table exists in a given schema
您可能希望也可能不想查询information_schema.tables
。最重要的是(per documentation):
仅显示当前用户有权访问的和观看次数 (作为所有者或拥有某种特权)。
大胆强调我的。
答案 2 :(得分:0)
您可以运行此查询
SELECT 'truncate ' || table_name || ';'
FROM information_schema.tables
WHERE table_schema='public' AND table_name LIKE 'beach%'
这将返回像
这样的行truncate someTableName;
表示以海滩开头的每张桌子。
复制结果集,粘贴并执行。
答案 3 :(得分:0)
以下是通过创建动态SQL来实现它的方法:
EXECUTE IMMEDIATE
请在这里阅读..
答案 4 :(得分:0)
最后我尝试了这个
ResultSet resultSet=stmt.executeQuery("SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_name LIKE 'beach_%'");
while (resultSet.next()) {
list_tables.add(resultSet.getString("table_name"));
}
for (String table : list_tables) {
stmt.executeUpdate("TRUNCATE "+table);
}
并且工作正常