Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

La contrainte de clé étrangère dans la table enfant permet d'insérer des valeurs qui n'existent pas dans la table parent

Premièrement, nous avons le pratique les raisons. Les clés étrangères sont conservées et vérifiées à l'aide d'index. Pour qu'un index soit utilisable, nous devons connaître les valeurs (recherchées) de toutes les colonnes de l'index. Si nous avons un index/pk sur (a,b) et nous avons une valeur de clé étrangère de (NULL,1) , nous ne pouvons pas rechercher dans l'index afin de déterminer s'il y a une ligne avec un b valeur de 1. Cela rendrait la clé étrangère "coûteuse" à maintenir.

Mais deuxièmement, nous devons tenir compte de la cohérence. Pour le cas d'une seule colonne, c'est assez peu controversé - si vous avez une valeur dans la colonne FK, alors il doit y avoir une valeur correspondante dans la colonne référencée. Sinon, si la colonne FK est NULL alors la contrainte n'est pas cochée.

Mais comment pouvons-nous étendre cela à plusieurs colonnes ? Qu'est-ce qu'est la règle ci-dessus? Il n'y a pas un single interprétation évidente, mais plutôt multiples. La règle ci-dessus est-elle "si tous les colonnes ne sont pas NULL, alors la contrainte est vérifiée" ou "si tout colonnes sont non-NULL, alors la contrainte est vérifiée" ? Ces règles sont identiques lorsqu'une seule colonne est considérée.

Vous vous attendiez à ce que la règle soit la deuxième, alors qu'en fait c'est la première. Ceci est explicitement documenté :