1

J'ai une table appelée city et une table appelée city_city. city_city corrèle deux enregistrements de ville, il a donc un id_de_vite et un id_de_city. Je peux imposer l'unicité sur fromcity_id et and tocity_id à l'aide d'une clé unique, mais comment puis-je imposer l'unicité de manière à ce que je ne puisse pas insérer un enregistrement si fromcity_id et tocity_id sont inversés.Comment appliquer cette contrainte dans le serveur SQL

Par exemple, les documents suivants sont conceptuellement les mêmes:

id fromcity_id tocity_id 
1  100   200 
2  200   100 

Répondre

1

Cela nécessitera un déclencheur, car vous avez besoin d'examiner les autres lignes. Alernately, vous pourriez le faire à la couche d'application.

1

Une autre option est de créer une vue indexée avec une contrainte unique sur le point de vue (horrible, mais aurait aussi faire le travail). La vue serait quelque chose comme:

CREATE VIEW vwSomeView WITH SCHEMABINDING 
AS 
    SELECT fromcity_id AS 'C1', tocity_id AS 'C2' FROM city_city 
    UNION ALL 
    SELECT tocity_id AS 'C1', fromcity_id AS 'C2' FROM city_city 

Ensuite, créez un index unique sur la vue:

CREATE UNIQUE INDEX UIX_vwSomeView ON vwSomeView (C1, C2) 

La question est de savoir si cela a plus, moins, ou de la même tête comme un déclencheur qui sélectionne la table sur chaque insert. La réponse à cela est de profiler et de tester votre charge de travail, les volumes de données et le débit.

0

Ajouter une contrainte de vérification qui impose (fromcity_id < tocity_id) et vous êtes tous ensemble