2017-09-28 6 views
0

J'utilise la base de données INFORMIX.Supprimer une contrainte de clé étrangère basée sur la sortie d'une instruction select complexe dans informix?

J'ai ajouté une clé forign à une table sans lui donner de nom, par ex.

ALTER TABLE myreport ADD CONSTRAINT FOREIGN KEY (rid) REFERENCES report(id), ADD CONSTRAINT FOREIGN KEY (uid) REFERENCES user(id); 

Je veux laisser tomber ses principales contraintes forign sur la base de la production d'une instruction select comme suit:

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 
     ) 
); 

qui renvoie une erreur 201: A syntax error has occurred.

Mais quand je exécutez-le séparément il fonctionne bien et donne les sorties suivantes comme suit:

Sélectionner:

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 
     ) 

donne:

constrname r169_278 
constrname r169_279 
constrname r169_280 

ALTER TABLE:

ALTER TABLE cuicscheduledreports DROP CONSTRAINT (r169_278, r169_279) 

Affiche un journal de succès

donc je besoin d'un ensemble de requêtes qui fera parvenir à mon exigence de manière dynamique, car il sera utilisé comme la migration pour db sur différents systèmes

+0

Alors, quel est le problème? –

Répondre

1

DROP CONSTRAINT ne permet pas une sous-requête de la contrainte des noms). Les noms de contraintes doivent être nommés explicitement.

La syntaxe de DROP CONSTRAINT est documenté ici: 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-+--+---+----------------| 
        '-(-'     '-)-' 

Seule une liste de noms séparés par des virgules est autorisée, pas un sous-requête.

Vous devez effectuer cette tâche en deux étapes, comme vous l'avez découvert. À l'avenir, vous devriez éviter de créer une syntaxe imaginaire et de vous attendre à ce qu'elle fonctionne. Consultez le manuel pour apprendre les options de syntaxe.

+0

Donc, vous pouvez me donner un ensemble de requêtes qui le feront dans aucune étape, Parce que cette requête est une migration pour db sur un système différent –

+0

Désolé, je n'ai aucune idée de quel outil de migration ou processus vous utilisez. –

+0

Il n'y a pas d'outil de migration, Nous écrivons un ensemble de fichiers sql que nous exécutons sur db un par un en utilisant des scripts, donc j'ai besoin d'un ensemble de requête qui s'exécutera sur différents systèmes et devrait abandonner –