2011-12-13 3 views
0

J'ai déjà une base de données avec des tables. J'ai ajouté des relations de clés étrangères (car elles renvoyaient des données d'une autre table, juste que cette relation n'était pas explicite dans la façon dont les tables étaient créées) pour l'une des tables.SQL Server - ajouter une relation de clé étrangère

Comment ce changement affecte-t-il la base de données existante? Le moteur de base de données doit-il effectuer un travail supplémentaire sur les données existantes dans la base de données? Ce changement peut-il être un "changement de rupture" si vous avez déjà une application qui utilise le schéma de base de données actuel?

+0

Comment "les données existantes" sont-elles "ajoutées" dans la base de données? C'est déjà là n'est pas ça? – Bart

+0

@bart Oui, les données sont déjà présentes. Juste avant que la relation primaire-étrangère ne soit explicite – Ghita

+0

Serveur Sql (2005 et 2008) – Ghita

Répondre

1

Si vous avez ajouté une contrainte référentielle, la base de données stocke cette contrainte et s'assure qu'elle est conservée. Par exemple, si la table A a une clé étrangère se référant à la table B, vous ne pouvez pas insérer une ligne dans la table A qui fait référence à une clé qui n'existe pas dans la table B.

+0

Oui, mais dans le cas où j'appliquerais cette relation après avoir déjà les données. Le serveur vérifie-t-il tous les éléments des tables afin de s'assurer que la relation est correcte? – Ghita

+1

@Ghita: Oui, SQL Server le fera pour vous (à moins que vous ne le disiez explicitement) –

+0

Comme l'a dit @marc_s, vous ne pouvez normalement pas appliquer une contrainte qui est cassée en premier lieu. Vous devez d'abord corriger les données. – Gigi

1

Il y a en effet du travail supplémentaire (bien que très minimal, en fonction de votre serveur de base de données) pour appliquer l'intégrité référentielle. En pratique, l'impact sur les performances n'est presque jamais quelque chose que vous remarquerez.

Il peut s'agir d'une "rupture de modification": votre code client peut insérer des données qui ne répondent pas aux contraintes référentielles. Si la base de données vous a permis de créer les contraintes en premier lieu, ce n'est pas probable, mais c'est possible.

+0

Je vois une activité élevée dans l'instance du serveur sql après l'ajout de la contrainte référentielle. Je ne peux pas dire exactement mais est-ce que ce pourrait être parce que le serveur vérifie l'intégrité après mon changement? C'est une très grande base de données. – Ghita

+0

Les clés primaires et les colonnes de clé étrangère sont-elles indexées? Sous le capot, SQL Server fait presque certainement un "select * de la table parent où primary_key = ????" pour chaque insertion/mise à jour. –

+0

Principalement la clé primaire est indexée. La clé étrangère n'est pas indexée. – Ghita

1

Vous pouvez spécifier WITH NOCHECK lors de la création d'une contrainte de clé étrangère:

L'option WITH NOCHECK est utile lorsque les données existantes répond déjà la nouvelle FOREIGN KEY contrainte, ou quand une règle métier nécessite la contrainte à exécuter seulement à partir de ce moment. Toutefois, vous devez faire attention lorsque vous ajoutez une contrainte sans en vérifiant les données existantes car cela contourne les contrôles du moteur de base de données qui appliquent l'intégrité des données de la table.

Questions connexes