Si vous avez vraiment besoin A_or_B_ID
de TableZ, vous avez deux options similaires:
1) Ajoutez des colonnes Nullable A_ID
et B_ID
à la table z, créez A_or_B_ID
une colonne calculée en utilisant ISNULL sur ces deux colonnes, et ajoutez une contrainte CHECK de telle sorte qu'un seul parmi A_ID
ou B_ID
ne soit pas nul
2) Ajoutez une colonne TableName à la table z, contrainte de contenir A ou B. maintenant créez A_ID
et B_ID
sous forme de colonnes calculées, qui ne sont non nulles que lorsque leur table appropriée est nommée (en utilisant l'expression CASE). Faites-les persister aussi
Dans les deux cas, vous disposez désormais de colonnes A_ID
et B_ID
qui peuvent avoir des clés étrangères appropriées pour les tables de base. La différence réside dans les colonnes calculées. De plus, vous n'avez pas besoin de TableName dans l'option 2 ci-dessus si les domaines des 2 colonnes d'ID ne se chevauchent pas - tant que votre expression de cas peut déterminer dans quel domaine A_or_B_ID
appartient
(Merci au commentaire pour avoir corrigé ma mise en forme)