Sql 按CONSTNAME删除外键

Sql 按CONSTNAME删除外键,sql,database,db2,Sql,Database,Db2,我想从表中删除外键,但我不知道它的标识符 我从SYSCAT.KEYCOLUSE表中获取标识符 之后,我尝试使用该标识符删除FK 获取标识符 SELECT keycoluse.CONSTNAME FROM SYSCAT.KEYCOLUSE keycoluse WHERE TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE' 结果=ID000000001 滴FK ALTER TABLE TABLE1 DROP FOR

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

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

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

获取标识符

SELECT keycoluse.CONSTNAME FROM SYSCAT.KEYCOLUSE keycoluse WHERE TABSCHEMA = 'USER1' AND TABNAME = 'TABLE1' AND COLNAME = 'ID_TABLE'
结果=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;
如果需要标识符,则不能使用变量(由子选择返回)或文字

您可以做的是从查询中生成一个脚本,尽管我无法想象您为什么要使用如此复杂的方法删除单个约束:

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

我认为值得一提的是,在进行较大更改时,使用这些脚本通常是正确的方法;不应该太劝阻人们不要使用它们。