我在表上有一个外键约束,该表是在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')
答案 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,因为没有任何对象变为无效。