2010-02-08 5 views
1

Outils: SQL2000/5/8, .NET 3.5, C#de fixation étrangères avec une base de données existante

Je suis venu à travers une application qui a deux tables. Dans « code » les tables ressemblent à ceci:

TABLE1 (1 - N) TABLEAU 2

Ainsi Tableau 1 (T1) a un Id: IdT1 et Table2 (T2) a son id (IdT2) et une clé étrangère t2.IdT1

Cette relation 1.N est code appliquée dans une certaine mesure. Il n'y avait aucun FK dans la DB. (Celui qui a conçu cela n'a pas ajouté de contraintes ni quelque chose de similaire). Le problème est, j'ai trouvé que l'application utilise le IdT1 dans TABLE2 pour (correctement) stocker la ligne référencée sur TABLE1, mais utilise également zéro (0) pour un cas particulier.

J'ai donc (en Tableau2) quelque chose le long de ces lignes:

IDt2 IdT1 OtherFields 
1 1 x 
2 1 x 
3 5 x 
4 0 x 
5 3 x 
6 0 x 
… 

Comme vous pouvez le voir dans les lignes 4 et 6 points FK à une ligne dans le tableau 1 inexistant. Le logiciel fonctionne parce qu'il a (beaucoup) d'endroits où il "suit" cela avec une instruction IF ou similaire. Changer cela maintenant n'est pas vraiment une bonne idée (je ne voudrais pas toucher au code qui "fonctionne et je n'ai pas écrit" en ce moment), sauf si c'est le seul moyen.

Maintenant, je suis modifier d'autres aspects de l'application et je besoin la base de données pour avoir les clefs étrangères (nous autogenerating code avec un modèle et si les clefs étrangères ne sont pas là, certaines choses ne seront pas générés) .

Étant donné le scénario ci-dessus, est-il possible de créer un FK qui ne vérifie pas les contraintes «jamais»? Est-ce que ce sera un "problème" (étant donné que l'App a travaillé pendant plus de 5 ans avec cette chose d'Id = 0 dans le FK)? Avez-vous des suggestions? Tks.

Répondre

2

Généralement, le seul but d'une contrainte de clé étrangère est de vérifier si la clé étrangère existe dans la table de clé primaire. Si vous ne le voulez pas, pourquoi le voulez-vous?

Une solution consiste à ajouter une ligne magique dans la table de clé primaire avec un PK de zéro, puis ajoutez la contrainte FK. Ce n'est pas la solution recommandée d'une approche puriste, mais étant donné les contraintes que vous spécifiez dans votre question, peut-être la meilleure solution.

+0

Merci pour la perspicacité. J'ai décidé de supprimer le FK (car comme vous l'avez dit, son but est vaincu) et de travailler avec le code. La rangée magique était tentante, mais je préfère ne pas prendre de routes magiques;) –

1

Si vous voulez créer un FK et que vous ne voulez pas qu'il vérifie les données existing, vous pouvez utiliser WITH NOCHECK ... mais encore une fois, vous vaincre tout le but d'un FK dans ce cas. Sachez également que les contraintes définies avec NOCHECK ne sont pas prises en compte par l'optimiseur de requête

+0

Merci SQLMenace, malheureusement le NOCHECK va - comme vous l'avez dit - vérifier uniquement les données ** existantes **. J'ai décidé de supprimer le FK étant donné que les données ne le rendent pas vraiment justice. –

Questions connexes