2011-06-15 2 views
2

J'ai la requête suivante qui ajoute une contrainte. mais pour ajouter, je veux vérifier si cette clé a déjà été utilisée ou non?SQL add Contrainte de clé étrangère avec vérification

ALTER TABLE HL7_MessageHierarchy 
ADD CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType) 
     REFERENCES HL7_MessageType(vMessageType); 

par exemple. si je dois ajouter une colonne, je peux facilement vérifier si la table existe dans sysobjects et sa colonne respective existe dans syscolumns.

Est-il possible d'utiliser la requête plusieurs fois sans GO et sans commettre d'erreur? si oui alors comment ???

[EDIT]

Je ne sais pas pourquoi mon navigateur ne me permet d'ajouter des commentaires, donc je suis Ajoutant à Modifier.

Je souhaite vérifier s'il existe une clé étrangère portant le même nom. Donc, s'il n'y a pas de données, la requête peut poser problème car la clé est déjà existante. Je veux exécuter le script ci-dessus propre (bien sûr les données de résident importent mais c'est peut-être un contrôle simple?) [EDIT]

mon mauvais, je devais avoir su que la version est importante ... je crois que c'est 2005 ... (aimera savoir si quelqu'un peut dire pour les autres versions)

Répondre

2

Dans SQL 2005, la méthode recommandée pour vérifier l'existence d'objets est Catalog Views. Celui que vous voulez est sys.foreign_keys:

IF NOT EXISTS (SELECT * FROM sys.foreign_keys 
       WHERE name = 'fk_vMessageType') 
BEGIN 
    EXEC (' 
    ALTER TABLE HL7_MessageHierarchy 
    ADD CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType) 
      REFERENCES HL7_MessageType(vMessageType) 
    ') 
END 

J'ai enveloppé la création en EXEC pour ne pas confondre l'analyseur.

+0

En fait, j'ai eu un problème sur mon lieu de travail - ne pouvait pas accepter comme réponse utile plus tôt. Merci. J'avais besoin de quelque chose comme ça. – Umer

3

Je suppose que vous voulez dire

vérifier la HL7_MessageHierarchy pour les valeurs non inHL7_MessageType »

Ainsi, une requête de l ike cela vous dira

SELECT * 
FROM HL7_MessageHierarchy H 
WHERE NOT EXISTS (SELECT * 
     FROM HL7_MessageType T 
     WHERE H.vMessageType = T.vMessageType) 

Aussi, je vous recommande d'utiliser WITH CHECK trop

ALTER TABLE HL7_MessageHierarchy WITH CHECK ADD 
CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType) 
     REFERENCES HL7_MessageType(vMessageType); 
+0

Merci, Bien qu'il soit extrêmement important de vérifier, mais @AakashM a eu ma question ... – Umer

Questions connexes