[英]Syntax error on Truncate SELECT table_name
我正在使用PostgreSQL,并尝试截断所有以'beach'
开头的表。
换句话说,我想做些类似的事情:
Truncate (SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public' AND table_name LIKE 'beach_%')
有任何想法吗?
首先阅读有关TRUNCATE
的手册,以获取有关正确语法的说明。
接下来,您正在寻找动态SQL ,因为您不能在TRUNCATE
对表名使用通配符或模式。 您需要动态编写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
。
相关答案:
删除所有视图PostgreSQL
考虑一下信息模式和系统目录之间的细微差别:
如何检查给定架构中是否存在表
您可能会或可能不想查询information_schema.tables
。 最重要的是( 根据文档 ):
仅显示当前用户有权访问的那些表和视图 (通过成为所有者或具有某些特权的方式)。
大胆强调我的。
您可以运行此查询
SELECT 'truncate ' || table_name || ';'
FROM information_schema.tables
WHERE table_schema='public' AND table_name LIKE 'beach%'
这将返回一行
truncate someTableName;
从海滩开始的每张桌子。
复制结果集,粘贴并执行。
请参阅此SQL Fiddle示例
通过创建动态SQL的方法如下:
EXECUTE IMMEDIATE
执行字符串 在这里阅读..
最后我试了一下
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);
}
而且效果很好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.