2017-09-28 68 views
0

我正在使用INFORMIX数据库。基于informix中复杂select语句的输出删除外键约束?

我已经在表格中添加了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: A syntax error has occurred.

但是,当我运行它分开它工作正常,并提供以下输出如下:

选择:

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 
     ) 

给出:

constrname r169_278 
constrname r169_279 
constrname r169_280 

ALTER TABLE:

ALTER TABLE cuicscheduledreports DROP CONSTRAINT (r169_278, r169_279) 

显示成功日志

所以我需要一组查询将做到实现我的动态方式的要求,因为这将被用来作为迁移的数据库不同的系统

+0

那么问题是什么? –

回答

1

DROP约束下不允许约束的子查询姓名(或名称)。约束名称必须明确命名。

DROP约束的语法如下记载:https://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0069.htm

DROP CONSTRAINT Clause 

          .-,----------.   
          V   |   
|--DROP CONSTRAINT--+---+----constraint-+--+---+----------------| 
        '-(-'     '-)-' 

只有逗号分隔的名字列表被允许,而不是一个子查询。

您必须按照您发现的两个步骤完成此任务。

未来,您应该避免编造虚构的语法并期待它的工作。查看手册以了解语法选项。

+0

所以,你可以给我一组查询,这将在任何步骤中执行,因为这个查询是在不同系统上的数据库迁移 –

+0

对不起,我不知道你正在使用什么迁移工具或过程。 –

+0

没有迁移工具,我们使用一些脚本编写一些我们在db上执行的sql文件,所以我需要一组查询语句,它将在不同的系统上执行,并且它应该放弃约束条件 –