我们可以在db2数据库中的ALTERTABLE命令中使用select查询吗

我们可以在db2数据库中的ALTERTABLE命令中使用select查询吗,db2,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 (S

我在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')

您可以为此使用复合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@
请记住,您还需要确保没有任何对象因此更改而变得无效

--#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@
请注意,可能有多个地址->城市引用。但是,如果这些表之间只有一个这样的外键,这将起作用。 这里我们假设两个表都在当前用户的模式中