Implémentation de contraintes uniques multi-colonnes dans SQL Server
Garantir des combinaisons uniques de valeurs sur plusieurs colonnes est essentiel au maintien de l'intégrité des données. Dans SQL Server, vous pouvez y parvenir en implémentant une contrainte unique ou un index unique sur une colonne spécifiée.
Identifier le besoin de contraintes uniques
L'exemple fourni met en évidence la nécessité de garantir des combinaisons uniques de champs PersonNumber et Active dans la table Personne. Cela empêche la saisie multiple d'une personne spécifique, où un seul enregistrement est autorisé par PersonNumber actif unique.
Ajouter une contrainte unique
Pour appliquer cette restriction, vous pouvez ajouter une contrainte unique en utilisant la syntaxe suivante :
<code class="language-sql">ALTER TABLE dbo.yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
Vous pouvez également créer un index unique :
<code class="language-sql">CREATE UNIQUE INDEX uq_yourtablename ON dbo.yourtablename(column1, column2);</code>
Les deux méthodes ont le même objectif, qui est de supprimer les enregistrements en double sur la base d'une combinaison de colonnes spécifiées.
Restez efficace
Assurez-vous de peser l'impact sur les performances lors de la mise en œuvre de contraintes uniques. Bien qu'ils garantissent l'intégrité des données, ils peuvent également entraîner une surcharge dans les opérations d'insertion si les contraintes sont fréquemment violées. Dans ce cas, envisagez d'utiliser un déclencheur INSTEAD OF pour intercepter et empêcher l'exécution d'insertions non valides.
<code class="language-sql">CREATE TRIGGER dbo.BlockDuplicatesYourTable ON dbo.YourTable INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; IF NOT EXISTS (SELECT 1 FROM inserted AS i INNER JOIN dbo.YourTable AS t ON i.column1 = t.column1 AND i.column2 = t.column2 ) BEGIN INSERT dbo.YourTable(column1, column2, ...) SELECT column1, column2, ... FROM inserted; END ELSE BEGIN PRINT '插入操作被阻止,因为该组合已存在。'; -- 提供用户反馈 END END GO</code>
N'oubliez pas de fournir un retour d'information à l'utilisateur si un déclencheur bloque une opération d'insertion afin d'éviter toute incertitude potentielle.
Exemple
L'application de cette solution à l'exemple fourni donne la structure de tableau suivante :
<code class="language-sql">CREATE TABLE dbo.Person ( ID INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(32), Active BIT, PersonNumber INT ); GO ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person UNIQUE(PersonNumber, Active); GO</code>
L'insertion d'enregistrements en double basés sur la combinaison PersonNumber et Active est désormais interdite, comme le montre l'exemple suivant :
<code class="language-sql">-- 成功 INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 1, 22); GO -- 成功 INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 0, 22); GO -- 失败 INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 1, 22); GO</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!