创建或替换表DB2?

创建或替换表DB2?,db2,Db2,作为python脚本的一部分,我运行以下3条SQL语句,以便在其余代码更新主表之前创建备份副本: DROP TABLE TABLEAU.TESTTABLEJBCOPY; CREATE TABLE TABLEAU.TESTTABLEJBCOPY LIKE TABLEAU.TESTTABLEJB; INSERT INTO TABLEAU.TESTTABLEJBCOPY (SELECT * FROM TABLEAU.TESTTABLEJB); 除了在表TABLEAU.TESTTABLEJBCOPYd

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

DROP TABLE TABLEAU.TESTTABLEJBCOPY;
CREATE TABLE TABLEAU.TESTTABLEJBCOPY LIKE TABLEAU.TESTTABLEJB;
INSERT INTO TABLEAU.TESTTABLEJBCOPY (SELECT * FROM TABLEAU.TESTTABLEJB);
除了在表
TABLEAU.TESTTABLEJBCOPY
dosen不存在的情况下,这种方法工作正常

我试过使用:

CREATE OR REPLACE TABLE TABLEAU.TESTTABLEJBCOPY LIKE TABLEAU.TESTTABLEJB;
INSERT INTO TABLEAU.TESTTABLEJBCOPY (SELECT * FROM TABLEAU.TESTTABLEJB);
然而,它不断地抛出错误

异常:[IBM][CLI驱动程序][DB2/LINUX8664]SQL0104N在“创建或替换”之后发现意外的令牌“表”。预期标记可能包括:“类型”。SQLSTATE=42601 SQLCODE=-104

我不知道该怎么处理

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


感谢

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

从DB2forLinux/Unix/Windows的v11.5版本,IBM添加了新语法
createtable。。。如果不存在
删除表格。。。如果存在

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

您还可以在删除表之前使用复合SQL查询表是否存在。这是经常被问到的问题。该机制也可以随Db2服务器操作系统平台的不同而变化


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

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

将原子视为自动在线

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

为什么不干脆删除所有行?@Dan Bracuk脚本不一定总是使用这些表来运行,因此复制表并不总是存在以从中删除行。因此,我需要一个创建或替换样式函数。@Josh-Dan的意思是“在创建数据库时创建表,然后(如果您使用它),只需先清除表即可”。尽管我对您的过程有问题,因为我目前理解它;一次只能运行一个更新进程,或者得到奇怪的结果。我会考虑做一些事情,比如将快照保存到临时/随机表中,或者在快照表上工作,或者类似的事情。
没有这样的语法…
我只是在iSeries上使用了这种语法。请参阅:。除非它只在IBMi上可用?