2010-05-05 7 views
2

J'ai une base de données SQL Server avec une table Apartment (qui contient les colonnes FloorNum et BuildingID) et une table ApartmentBuilding (avec la colonne NumFloors). Est-il possible de configurer une contrainte (à l'aide de l'interface utilisateur SQL Server) pour vérifier que Apartment.FloorNum est supérieur à ApartmentBuilding.NumFloors?Contraintes SQL Server entre les tables

J'ai essayé ceci:

FloorNum > ApartmentBuilding.NumFloors 

mais maintenant je me rends compte que j'ai en quelque sorte à se joindre aux colonnes du BuildingID, mais je ne sais pas comment faire au sein d'une contrainte.

Merci pour votre aide!

Répondre

3

Vous ne pouvez pas faire cela avec une contrainte CHECK car elle nécessite des données d'une autre table. Vous gérer cela avec un INSERT/UPDATE trigger.

+0

Pas étonnant que je ne pouvais pas comprendre comment le faire! Merci de m'avoir empêché de perdre mon temps. – chama

0
  1. Dans le tableau Immeuble d'appartements, ajoutez une contrainte UNIQUE sur (BuildingID, NumFloors)
  2. Dans le tableau Appartement, ajoutez la colonne NumFloorsInBuilding
  3. Dans le tableau Appartement, ajoutez clé étrangère (BuildingID, NumFloorsInBuilding) se référant à (BuildingID, NumFloors). Cela garantit que NumFloorsInBuilding est toujours égal à NumFloors dans la table parente.
  4. Dans le tableau Appartement, ajouter CHECK (FloorNum < NumFloorsInBuilding)
+1

Le simple fait d'ajouter une référence de clé étrangère ne remplit pas comme par magie la colonne 'BuildingID' de la table Apartment. Bien sûr - si vous ajoutez manuellement le max. nombre d'étages à chaque appartement, alors la contrainte CHECK est un morceau de gâteau - mais cela duplique inutilement l'information qui est déjà dans la table de construction .... –

+0

Sûrement il duplique l'information, aucun argument ici. Si vous avez besoin d'une intégrité solide, c'est la seule solution. Si vous tolérez certaines données invalides, optez pour des déclencheurs. –

Questions connexes