创建或替换 DB2 表格?

3
作为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

我不确定如何处理这个问题。

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

谢谢


为什么不直接删除所有行? - Dan Bracuk
@ Dan Bracuk 这个脚本不一定总是使用这些表,因此复制表不一定存在以删除行。这就是为什么我需要一个创建或替换样式的函数。 - Josh
@Josh - Dan 的意思是“在数据库创建期间创建表,然后(如果您使用它),只需首先清除表格”。 - Clockwork-Muse
尽管我目前对你的流程存在问题,但你只能同时运行一个更新进程,否则会得到奇怪的结果。我建议你考虑将快照保存到临时/随机表中,或在快照表上进行操作,或类似的处理方式。 - Clockwork-Muse
2个回答

0

对于 Db2-Linux/Unix/Windows 版本 11.1 及以下,不存在 "create or replace table" 的语法。其他的 Db2 平台可能会有所不同(因为在 z/OS、i-series 和 Linux/Unix/Windows 上,语法各不相同)。

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

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

您还可以使用复合 SQL 查询是否存在表,然后再将其删除。这是经常被问到的问题。该机制也可能因为您的 Db2 服务器操作系统平台而有所不同。

为了创建一个表的备份副本,您还可以考虑在使用 CREATE TABLE LIKE 前在表名中添加时间戳(作为后缀或前缀)。然后,您就不太可能需要删除该表(除非手动之后确定不再需要备份副本)。


没有这样的语法…… 好吧,我刚在我们的 iSeries 上使用了那个语法。请参见:https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/sqlp/rbafyreplacetable.htm。除非它只在 IBM i 上可用? - Cypher

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;   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接