J'ai une table et, d'une manière ou d'une autre, la même personne est entrée dans mon Person
installée deux fois table. À l'heure actuelle, la clé primaire est simplement un numéro automatique, mais il existe deux autres champs que je veux forcer à être uniques.
Par exemple, les champs sont:
ID
Name
Active
PersonNumber
Je veux seulement 1 enregistrement avec un PersonNumber unique et Active = 1.
(La combinaison des deux champs doit donc être unique)
Quelle est la meilleure façon sur une table existante dans un serveur SQL que je puisse faire en sorte que si quelqu'un d'autre fasse une insertion avec la même valeur qu'une valeur existante, elle échoue afin que je n'ai pas à m'inquiéter à ce sujet dans le code de mon application.
sql
sql-server
Léora
la source
la source
Réponses:
Une fois que vous avez supprimé votre (vos) duplicata (s):
ou
Bien sûr, il peut souvent être préférable de vérifier d'abord cette violation, avant de simplement laisser SQL Server essayer d'insérer la ligne et de renvoyer une exception (les exceptions coûtent cher).
http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling
http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/
Si vous souhaitez empêcher les exceptions de se propager dans l'application, sans apporter de modifications à l'application, vous pouvez utiliser un
INSTEAD OF
déclencheur:Mais si vous ne dites pas à l'utilisateur qu'il n'a pas effectué l'insertion, il se demandera pourquoi les données ne sont pas là et aucune exception n'a été signalée.
EDIT voici un exemple qui fait exactement ce que vous demandez, même en utilisant les mêmes noms que votre question, et le prouve. Vous devriez l'essayer avant de supposer que les idées ci-dessus ne traitent qu'une colonne ou l'autre par opposition à la combinaison ...
Données dans le tableau après tout cela:
Message d'erreur sur la dernière insertion:
la source
Cela peut également être fait dans l'interface graphique:
la source
new Index
n'est pas cliquable, il est désactivé :(Dans mon cas, je devais autoriser de nombreux inactifs et une seule combinaison de deux clés actives, comme ceci:
Cela semble fonctionner:
Voici mes cas de test:
la source
Et si vous avez beaucoup de requêtes d'insertion mais que vous ne voulez pas générer de message d'erreur à chaque fois, vous pouvez le faire:
la source