如果不存在语法db2,则创建表

时间:2015-08-04 08:52:06

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

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

我尝试了谷歌并获得了一些适用于其他人的解决方案但不适合我:

方法1:

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

方法2:

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

这也让我犯了错误42601

方法3:

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

这也让我误以为42601

请告知。

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

您可以检查table exist or not是否使用sysibm.systables, 对于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;

答案 2 :(得分:-5)

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name     {LIKE old_tbl_name | (LIKE old_tbl_name)}

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