繁体   English   中英

截断SELECT table_name的语法错误

[英]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与子查询一起使用(请参阅doc )。 此外,您可能需要一个过程来遍历这些表并将其截断。

首先阅读有关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的方法如下:

  1. 创建要截断的字符串
  2. 使用EXECUTE IMMEDIATE执行字符串

在这里阅读..

http://www.postgresql.org/docs/9.2/static/ecpg-dynamic.html

最后我试了一下

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM