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é :