Sql 根据informix中复杂select语句的输出删除外键约束?

Sql 根据informix中复杂select语句的输出删除外键约束?,sql,foreign-keys,informix,Sql,Foreign Keys,Informix,我正在使用INFORMIX数据库 我在表中添加了forign键,但没有给它命名,例如 ALTER TABLE myreport ADD CONSTRAINT FOREIGN KEY (rid) REFERENCES report(id), ADD CONSTRAINT FOREIGN KEY (uid) REFERENCES user(id); 我希望根据select语句的输出删除其forign键约束,如下所示: ALTER TABLE myreport DROP CONSTRAINT (

我正在使用INFORMIX数据库

我在表中添加了forign键,但没有给它命名,例如

ALTER TABLE myreport ADD CONSTRAINT FOREIGN KEY (rid) REFERENCES report(id), ADD CONSTRAINT FOREIGN KEY (uid) REFERENCES user(id);
我希望根据select语句的输出删除其forign键约束,如下所示:

ALTER TABLE myreport DROP CONSTRAINT (
   SELECT b.constrname
       FROM
           systables a, sysconstraints b, sysindexes c, syscolumns d
       WHERE
           a.tabname = 'myreport' AND (d.colname='rid' or d.colname='uid')
       AND
           b.tabid = a.tabid
       AND
           c.idxname = b.idxname
       AND
           d.tabid = a.tabid
       AND
       (
           d.colno = c.part1 or d.colno = c.part2 or d.colno = c.part3 or d.colno = c.part4 or
           d.colno = c.part5 or d.colno = c.part6 or d.colno = c.part7 or d.colno = c.part8 or
           d.colno = c.part9 or d.colno = c.part10 or d.colno = c.part11 or d.colno = c.part12 or
           d.colno = c.part13 or d.colno = c.part14 or d.colno = c.part15 or d.colno = c.part16
       )
);
引发错误
201:发生语法错误。

但当我单独运行它时,它工作正常,并给出如下输出:

ALTER TABLE myreport DROP CONSTRAINT (
   SELECT b.constrname
       FROM
           systables a, sysconstraints b, sysindexes c, syscolumns d
       WHERE
           a.tabname = 'myreport' AND (d.colname='rid' or d.colname='uid')
       AND
           b.tabid = a.tabid
       AND
           c.idxname = b.idxname
       AND
           d.tabid = a.tabid
       AND
       (
           d.colno = c.part1 or d.colno = c.part2 or d.colno = c.part3 or d.colno = c.part4 or
           d.colno = c.part5 or d.colno = c.part6 or d.colno = c.part7 or d.colno = c.part8 or
           d.colno = c.part9 or d.colno = c.part10 or d.colno = c.part11 or d.colno = c.part12 or
           d.colno = c.part13 or d.colno = c.part14 or d.colno = c.part15 or d.colno = c.part16
       )
);
选择:

SELECT b.constrname
       FROM
           systables a, sysconstraints b, sysindexes c, syscolumns d
       WHERE
           a.tabname = 'myreport' AND (d.colname='rid' or d.colname='uid')
       AND
           b.tabid = a.tabid
       AND
           c.idxname = b.idxname
       AND
           d.tabid = a.tabid
       AND
       (
           d.colno = c.part1 or d.colno = c.part2 or d.colno = c.part3 or d.colno = c.part4 or
           d.colno = c.part5 or d.colno = c.part6 or d.colno = c.part7 or d.colno = c.part8 or
           d.colno = c.part9 or d.colno = c.part10 or d.colno = c.part11 or d.colno = c.part12 or
           d.colno = c.part13 or d.colno = c.part14 or d.colno = c.part15 or d.colno = c.part16
       )
ALTER TABLE cuicscheduledreports DROP CONSTRAINT (r169_278, r169_279)
给出:

constrname  r169_278
constrname  r169_279
constrname  r169_280
更改表格:

SELECT b.constrname
       FROM
           systables a, sysconstraints b, sysindexes c, syscolumns d
       WHERE
           a.tabname = 'myreport' AND (d.colname='rid' or d.colname='uid')
       AND
           b.tabid = a.tabid
       AND
           c.idxname = b.idxname
       AND
           d.tabid = a.tabid
       AND
       (
           d.colno = c.part1 or d.colno = c.part2 or d.colno = c.part3 or d.colno = c.part4 or
           d.colno = c.part5 or d.colno = c.part6 or d.colno = c.part7 or d.colno = c.part8 or
           d.colno = c.part9 or d.colno = c.part10 or d.colno = c.part11 or d.colno = c.part12 or
           d.colno = c.part13 or d.colno = c.part14 or d.colno = c.part15 or d.colno = c.part16
       )
ALTER TABLE cuicscheduledreports DROP CONSTRAINT (r169_278, r169_279)
显示成功日志

因此,我需要一组查询,这些查询将以动态方式实现我的需求,因为它将用作不同系统上的数据库迁移


DROP CONSTRAINT不允许对约束名称进行子查询。约束名称必须显式命名

此处记录了DROP CONSTRAINT的语法:

只允许使用逗号分隔的名称列表,不允许使用子查询

正如您所发现的,您必须分两步完成此任务


在将来,您应该避免虚构语法并期望它能够工作。查看手册了解语法选项。

那么有什么问题吗?那么您能给我一组查询,这些查询可以在任何步骤中完成,因为此查询是在不同系统上对db的迁移对不起,我不知道您使用的是什么迁移工具或过程。没有迁移工具,我们编写了一些sql文件集,我们使用一些脚本一个接一个地在db上执行,所以我需要一组查询语句,它将在不同的系统上执行,它应该删除ConstraintsOkay,那么您已经有了解决方案。你把它贴在上面的问题上了。执行SELECT以获取约束的名称,然后使用该结果形成ALTERTABLE语句。