【问题标题】:Create table if not exists syntax db2如果不存在则创建表语法 db2
【发布时间】:2026-02-15 12:35:01
【问题描述】:

我希望编写一个 SQL 脚本,在创建表/序列之前检查表/序列是否存在。

我尝试了谷歌并获得了一些对其他人有用但对我无效的解决方案:

方法一:

SELECT *
FROM   tableA
WHERE  EXISTS
 (SELECT * from tableB);

这适用于select 语句。然后我尝试使用 create table 语句:

CREATE TABLE "SMEADM"."JXTEST"  (
          "ACCOUNTSENTRYID" BIGINT NOT NULL  )   
         IN "DATATBSP"
WHERE  EXISTS
 (SELECT * from tableB);

这将遇到错误42601

方法二:

CREATE TABLE IF NOT EXISTS "SMEADM"."JXTEST"  (
          "ACCOUNTSENTRYID" BIGINT NOT NULL  )   
         IN "DATATBSP" ; 

这也给我带来了错误42601

方法三:

begin
  declare continue handler for sqlstate '42710' begin end;
  execute immediate 'CREATE TABLE "SMEADM"."JXTEST"  (
          "ACCOUNTSENTRYID" BIGINT NOT NULL  )   
         IN "DATATBSP"';
end

这也给我带来了错误42601

请多多指教。

【问题讨论】:

  • DB2 的版本和平台是什么?
  • 版本是DB2 v10.1.0.0,如何查看平台?

标签: sql database db2 create-table not-exists


【解决方案1】:

正确的方法是您的第三个选项,但是您必须正确编写它。如果您阅读输出消息,您会发现存在无效字符(42601 SQL 状态)。这是由于没有结束字符的字符串。您不能拥有多行字符串,而是必须创建多行并将它们连接起来。

当我跑步时:

begin
  declare continue handler for sqlstate '42710' begin end;
  execute immediate 'CREATE TABLE "SMEADM"."JXTEST"  ('
         || ' "ACCOUNTSENTRYID" BIGINT NOT NULL  )   '
         || 'IN "DATATBSP"';
end

我明白了:

begin
  declare continue handler for sqlstate '42710' begin end;
  execute immediate 'CREATE TABLE "SMEADM"."JXTEST"  ('
db2 (cont.) => db2 (cont.) => db2 (cont.) =>          || ' "ACCOUNTSENTRYID" BIGINT NOT NULL  )  '  ;
db2 (cont.) => end@
DB20000I  The SQL command completed successfully.

【讨论】:

  • 其实我还在打42719 erro。 Begin declare continue handler for sqlstate '42710' begin end DB21034E 该命令被作为 SQL 语句处理,因为它不是有效的命令行处理器命令。在 SQL 处理期间,它返回: SQL0104N 在“lstate '42710' begin”之后发现了一个意外的标记“end”。预期的标记可能包括:“”。第 2 行。 SQLSTATE=42601
  • 我迟到了几年,但是@panadol-chong 无论你在什么地方运行你的 sql,都没有将这些行作为单个语句执行。
【解决方案2】:

您可以使用sysibm.systables检查table exist or not是否, 对于sequence,您可以使用SYSIBM.SYSSEQUENCES

DECLARE
    v_tbl_cnt NUMBER(1,0);
    v_seq_cnt NUMBER(1,0);
BEGIN
    select count(1) into v_tbl_cnt 
    from sysibm.systables
    where owner = 'your_schema'
    and type = 'T'
    and name = 'your_table';

    IF (v_tbl_cnt = 0) THEN --table not exists
        execute immediate 'create table ...'; --create table
    END IF;

    select count(1) into v_seq_cnt 
    from SYSIBM.SYSSEQUENCES
    where owner = 'your_schema'
    and name = 'your_sequence';

    IF (v_seq_cnt = 0) THEN --sequence not exists
        execute immediate 'create sequence ...'; --create sequence
    END IF;
END;

【讨论】:

  • 如果序列呢?
  • 您可以使用相同的方法使用SYSIBM.SYSSEQUENCESlink
  • 用序列案例更新了答案。
【解决方案3】:

创建 [临时] 表 [如果不存在] tbl_name { 喜欢 old_tbl_name | (喜欢 old_tbl_name)}

检查下面的链接我不确定它是否会起作用,请尝试看看。 http://dev.mysql.com/doc/refman/5.1/en/create-table.html

【讨论】:

  • 问题是针对 DB2 而不是 MySQL。