通过CONSTNAME删除外键

时间:2017-02-02 17:29:57

标签: sql database db2

我想从表中删除一个外键但我不知道它的标识符。

我从SYSCAT.KEYCOLUSE表中获取标识符。

之后我尝试使用该标识符删除FK。

获取标识符

SELECT keycoluse.CONSTNAME FROM SYSCAT.KEYCOLUSE keycoluse WHERE TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE'

result = ID000000001

放弃FK

ALTER TABLE TABLE1
DROP FOREIGN KEY (SELECT keycoluse.CONSTNAME FROM SYSCAT.KEYCOLUSE keycoluse WHERE TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE');

此抛出错误:[错误代码:-104,SQL状态:42601]

但是,如果我以这种方式使用我之前获得的标识符,它可以工作:

ALTER TABLE TABLE1
DROP FOREIGN KEY ID000000001;

通过这种方式,它不起作用:

ALTER TABLE TABLE1
DROP FOREIGN KEY 'ID000000001';

当我执行SELECT以获取id时,它会获得一个varchar'ID000000001'并且会出错。

¿有没有办法将SELECT的结果转换为我们在此命令中的相同类型?

ALTER TABLE TABLE1
DROP FOREIGN KEY ID000000001;

1 个答案:

答案 0 :(得分:0)

您不能使用变量(由子选择返回)或需要标识符的文字。

可以做的是从你的查询中生成一个脚本,虽然我无法想象为什么你会想要使用这种复杂的方法来删除一个约束:

SELECT 
  'ALTER TABLE', 'TABLE1',
  'DROP FOREIGN KEY', keycoluse.CONSTNAME 
FROM 
  SYSCAT.KEYCOLUSE keycoluse 
WHERE 
  TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE'

查询将返回正确的ALTER语句。您可以将其复制/粘贴到您喜欢的客户端软件中,或将结果写入文本文件并执行它,例如,使用

db2 -f mydropscript.sql