【问题标题】:Can we use a select query in alter table command in db2 database我们可以在 db2 数据库的 alter table 命令中使用选择查询吗
【发布时间】:2018-11-02 12:22:31
【问题描述】:

我在 db2 中使用以下命令创建的表上有一个外键约束

ALTER TABLE "ADDRESS" ADD FOREIGN KEY("CITY_ID") REFERENCES CITY("ID");

现在我正在尝试删除约束。由于在创建时没有为约束指定名称,因此删除外键的 alter 命令不起作用。

我能否在 alter table 命令中使用 select 命令,以便查询 SYSCAT.TABCONST 表以获取约束 ID?

类似

ALTER TABLE ADDRESS DROP FOREIGN KEY 
  (SELECT CONSTNAME FROM SYSCAT.TABCONST where tabname='ADDRESS' and TYPE='F')

【问题讨论】:

    标签: db2


    【解决方案1】:
    --#SET TERMINATOR @
    BEGIN
      EXECUTE IMMEDIATE (SELECT 'ALTER TABLE '||TABSCHEMA||'.'||TABNAME||' DROP CONSTRAINT '||CONSTNAME FROM SYSCAT.REFERENCES WHERE TABSCHEMA=USER AND TABNAME='ADDRESS' AND REFTABSCHEMA=USER AND REFTABNAME='CITY');
    END@
    

    请注意,可能有多个 ADDRESS -> CITY 引用。但如果这些表之间只有一个这样的外键,这将起作用。 我们在这里假设两个表都在当前用户的模式中。

    【讨论】:

      【解决方案2】:

      您可以为此使用复合 SQL。这是一个例子:

      --#SET TERMINATOR @
      begin
          declare v_fkname varchar(128) default '';
          declare v_sql varchar(1024);
          declare v_not_found integer default 0;
          declare not_found condition for sqlstate '02000';
          declare continue handler for not_found set v_not_found=1 ;
          set v_fkname = (select constname from syscat.tabconst where tabname='ACTORS' and tabschema='USER1' and type='F');
          if v_not_found = 0
          then
              set v_sql='ALTER TABLE actors DROP FOREIGN KEY '||v_fkname ;
              execute immediate(v_sql);
          end if;
      end@
      

      请记住,之后您还需要verify 确认没有任何对象因此更改而变得无效。

      【讨论】:

        猜你喜欢
        • 2011-10-10
        • 2011-02-07
        • 1970-01-01
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2021-03-27
        相关资源
        最近更新 更多