创建或替换表DB2?

时间:2017-12-29 17:16:04

标签: db2

作为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驱动程序] [DB2 / LINUXX8664] SQL0104N在“CREATE OR REPLACE”之后找到了意外的令牌“TABLE”。预期的代币可能包括:“TYPE”。 SQLSTATE = 42601    SQLCODE = -104

我不知道如何处理。

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

由于

2 个答案:

答案 0 :(得分:0)

在Db2中没有“创建或替换表”这样的语法。 您必须先删除表(如果不存在,则忽略该警告),然后创建表。 如果表不存在,您可以脚本忽略与drop table失败相对应的sqlstate。

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

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

答案 1 :(得分:0)

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

将原子视为自动排列。

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