Truncate SELECT table_name上的语法错误

时间:2014-07-07 16:04:52

标签: sql database postgresql dynamic-sql

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

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

有什么想法吗?

5 个答案:

答案 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;

表示以海滩开头的每张桌子。

复制结果集,粘贴并执行。

请参阅此SQL Fiddle Example

答案 3 :(得分:0)

以下是通过创建动态SQL来实现它的方法:

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

    请在这里阅读..

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

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

并且工作正常