【问题标题】:SQL Query to truncate table in IBM DB2用于截断 IBM DB2 中的表的 SQL 查询
【发布时间】:2011-03-01 17:21:43
【问题描述】:

谁能给我截断 IBM DB2 中表的语法。

我正在运行以下命令:truncate table tableName immediate;

错误是 DB2

SQLCODE=-104, SQLSTATE=42601, SQLERRMC=table;truncate ;JOIN , DRIVER=3.50.152 消息:在“truncate”之后发现了一个意外的标记“table”。预期的标记可能包括:“JOIN”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.50.152

语法与 IBM 参考文档中指定的语法相匹配:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.sqlref/db2z_sql_truncate.htm

【问题讨论】:

  • 您运行的是什么版本的 DB2?

标签: syntax db2 truncate


【解决方案1】:

有一篇关于truncating 的好文章,这里是 DB2 东西的要点

几乎遵循标准。(从 9.7 版开始) DB2 要求在普通的 TRUNCATE TABLE 语句中添加 IMMEDIATE 关键字,例如:

TRUNCATE TABLE someschema.sometable IMMEDIATE 

TRUNCATE TABLE 必须是事务中的第一条语句。以 TRUNCATE TABLE 开头的事务可能包含其他语句,但如果事务回滚,则不会撤消 TRUNCATE TABLE 操作。 DB2s TRUNCATE TABLE 操作有许多可选参数,有关更多信息,请参阅文档;特别是,REUSE STORAGE 参数对于临时 DBA 任务可能很重要。 在 DB2 版本

在类 unix 系统上: IMPORT FROM /dev/null OF DEL REPLACE INTO 表名 在 Windows 上: 从 NUL OF DEL REPLACE 导入表名 IMPORT 不能在所有情况下都被滥用。例如,当使用动态 SQL(来自 Java/.NET/PHP/...——不使用 db2 命令行处理器)时,您需要将 IMPORT 命令包装在对 ADMIN_CMD 的调用中,例如:

CALL ADMIN_CMD('IMPORT FROM /dev/null OF DEL REPLACE INTO tablename')

在涉及其他操作的事务中似乎允许使用 IMPORT,但它意味着立即执行 COMMIT 操作。

ALTER TABLE 命令也可能被滥用来快速清空表,但它需要更多权限,并且可能会导致前滚恢复问题。

这是从网站上截取的: http://troels.arvin.dk/db/rdbms/#bulk-truncate_table-db2

【讨论】:

  • 谢谢。 IMPORT FROM /dev/null OF DEL REPLACE INTO 表名成功了
【解决方案2】:

如果您使用 DB2 for AS400,IMMEDIATE TRUNCATE TABLE 将不起作用。等效的解决方法是:

  • DELETE FROM [tableName]
  • 如果它是一个自动增量等价列,请运行:
  • ALTER TABLE ALTER COLUMN RESTART WITH 1
  • 或者更快(最有效的方式)

  • 向系统传递命令以清除物理文件
  • Java 语法:

    CommandCall command = new CommandCall(new AS400(AS400SystemName, AS400JavaUser, AS400JavaPwd));
    try {
        command.run("CLRPFM FILE(as400SchemaName/" + tableName + ")");
    

    【讨论】:

    • 事实证明,有一种方法可以实际执行与 TRUNCATE TABLE 等效的操作,而不仅仅是删除所有行。命令语法一点都不直观:stackoverflow.com/a/3616556/95852
    • IBM 最终决定将 TRUNCATE 语句添加到 Db2 for i,版本为 7.2
    【解决方案3】:

    您使用的是哪个版本的 DB2? truncate table 命令是在 DB2 v9 中引入的(至少在大型机上,这似乎是您根据链接询问的内容)。

    您可能不得不求助于delete from 选项,尽管this article 提供了一种在DB2 v8 中执行此操作的存储过程方式。

    【讨论】:

      【解决方案4】:

      使用立即截断'table_name'

      【讨论】:

        【解决方案5】:

        这是从 9.7 版本起可用于 DB2 中 TRUNCATE 的确切参考文档

        DB2 Reference for TRUNCATE

        【讨论】:

          【解决方案6】:

          z/OS V10 上的 DB2 清空您的一张表:截断表;其次是提交工作。前任。截断温度; 其他人表:截断 owner.table 例如:截断 student.work ; 我没有在链接的 DB2 上尝试过这个。我不知道是否截断 node2.student.work;很好。

          用于自动创建表列表的 SQL。使用子字符串 (substr),因为表名和创建者的列宽太长。你的价值观可能不同。

          select 'truncate table '||substr(creator,1,9)||'.'||substr(name,1,20)  
              from sysibm.systables
                  where creator = 'Student';
          

          【讨论】:

            【解决方案7】:

            在 Java 中确保它是事务中的第一条语句

            【讨论】:

              猜你喜欢
              • 2016-10-07
              • 1970-01-01
              • 1970-01-01
              • 2019-01-15
              • 1970-01-01
              • 1970-01-01
              • 2020-07-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多