【问题标题】:Create or replace table DB2?创建或替换表 DB2?
【发布时间】:2018-06-10 02:20:17
【问题描述】:

作为 python 脚本的一部分,我正在运行以下 3 个 SQL 语句,以便在其余代码更新主表之前创建备份副本:

DROP TABLE TABLEAU.TESTTABLEJBCOPY;
CREATE TABLE TABLEAU.TESTTABLEJBCOPY LIKE TABLEAU.TESTTABLEJB;
INSERT INTO TABLEAU.TESTTABLEJBCOPY (SELECT * FROM TABLEAU.TESTTABLEJB);

这可以正常工作,除非表 TABLEAU.TESTTABLEJBCOPY 不存在。

我尝试过使用:

CREATE OR REPLACE TABLE TABLEAU.TESTTABLEJBCOPY LIKE TABLEAU.TESTTABLEJB;
INSERT INTO TABLEAU.TESTTABLEJBCOPY (SELECT * FROM TABLEAU.TESTTABLEJB);

但是它一直在拉错误

异常:[IBM][CLI Driver][DB2/LINUXX8664] SQL0104N 在“CREATE OR REPLACE”之后发现了意外的标记“TABLE”。预期的标记可能包括:“TYPE”。 SQLSTATE=42601 SQLCODE=-104

我不知道如何处理。

或者,是否有更好的方法让它在尝试删除表之前检查表是否不存在。

谢谢

【问题讨论】:

  • 为什么不直接删除所有行?
  • @ Dan Bracuk 该脚本不一定总是使用这些表运行,因此复制表不会总是存在以从中删除行。因此,为什么我需要创建或替换样式功能。
  • @Josh - Dan 的意思是“在数据库创建期间创建表,然后(如果你使用它),先清除表”。
  • 虽然我目前了解您的流程有问题;您一次只能运行一个更新过程,或者得到奇怪的结果。我会考虑做一些事情,比如将快照保存到临时/随机表中,或者在快照表上做一些工作,或者类似的事情。

标签: db2


【解决方案1】:

对于最高版本 11.1 的 Db2-Linux/Unix/Windows,没有“创建或替换表”这样的语法。其他 Db2 平台可能会有所不同(因为语法在 z/OS、i 系列和 Linux/Unix/Windows 中有所不同)。

从 Db2 for Linux/Unix/Windows v11.5 开始,IBM 添加了新语法 create table ... if not existsdrop table ... if exists

对于 V11.5 之前的版本,您可以先删除表(如果不存在则忽略警告),然后再创建表。 如果表不存在,您可以编写脚本忽略删除表失败对应的SQLSTATE。

您还可以在删除表之前复合 SQL 来查询表是否存在。这是经常被问到的。该机制也可能因您的 Db2 服务器操作系统平台而异。

为了创建表的备份副本,您还可以考虑在使用 CREATE TABLE LIKE 之前向表名添加时间戳(作为后缀或前缀)。这样您就不太可能需要删除表(除非稍后您知道不再需要备份副本时手动删除)。

【讨论】:

【解决方案2】:

在删除前检查表是否存在。

将 atomic 视为自动排队。

BEGIN ATOMIC                 
IF( EXISTS(                  
SELECT 1 FROM tables          
WHERE TABLE_SCHEMA = 'mylib'  
AND TABLE_NAME = 'mytable'
)) THEN                      
DROP table  mylib.mytable;  
END IF;                      
END;   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多