我们可以在db2数据库的alter table命令中使用选择查询吗?

时间:2018-11-02 12:22:31

标签: db2

我在表上有一个外键约束,该表是在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')

2 个答案:

答案 0 :(得分: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引用。但是,如果这些表之间只有一个这样的外键,这将起作用。 我们在这里假设两个表都在当前用户的模式中。

答案 1 :(得分:0)

您可以为此使用复合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,因为没有任何对象变为无效。