Sql 截断选择表\u名称时出现语法错误

Sql 截断选择表\u名称时出现语法错误,sql,database,postgresql,dynamic-sql,Sql,Database,Postgresql,Dynamic Sql,我正在使用PostgreSQL,并尝试截断所有以'beach'开头的表 换句话说,我想做一些类似的事情: Truncate (SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name LIKE 'beach_%') 有什么想法吗?这不是有效的语法。不能对子查询使用TRUNCATE(请参阅)。此外,您可能需要遍历这些表并截断它们

我正在使用PostgreSQL,并尝试截断所有以
'beach'
开头的表
换句话说,我想做一些类似的事情:

Truncate (SELECT table_name
          FROM information_schema.tables
          WHERE table_schema = 'public' AND table_name LIKE 'beach_%')

有什么想法吗?

这不是有效的语法。不能对子查询使用
TRUNCATE
(请参阅)。此外,您可能需要遍历这些表并截断它们

您可以运行此查询

SELECT 'truncate ' || table_name || ';'
FROM information_schema.tables
WHERE table_schema='public' AND table_name LIKE 'beach%'
这将返回一行,如

truncate someTableName;
从海滩开始的每张桌子

复制结果集,粘贴它,然后执行它


请参见

以下是创建动态SQL的方法:

  • 创建要截断的字符串
  • 使用
    executeimmediate
  • 请看这里

    首先阅读,了解有关正确语法的说明

    接下来,您将查找动态SQL,因为在
    TRUNCATE
    中不能对表名使用wilcards或patterns。您需要动态组合SQL命令。您可以像已通知的那样,通过两次往返服务器来完成此操作,也可以使用一条语句:

    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

    相关答案:

    考虑信息模式系统目录之间的细微差异:

    您可能希望也可能不希望改为查询
    信息\u schema.tables
    。最重要的是():

    只有那些表和视图显示当前用户具有访问权限 (作为所有者或拥有某种特权)


    粗体强调我的。

    最后我尝试了这个

         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); 
        }
    

    它工作正常

    您不能用这种方式使用truncate。您需要创建动态SQL语句字符串并执行它们。
    beach
    bridge
    ?我以你为例。