Assurer les contraintes d'unicité de la combinaison de colonnes SQL Server
Il peut y avoir plusieurs enregistrements avec la même valeur de colonne dans la table de la base de données. Pour éviter cela, vous pouvez appliquer une contrainte d'unicité qui exige qu'une combinaison spécifique de colonnes soit unique dans la table.
Par exemple, un tableau contient les colonnes suivantes :
Obligatoire pour garantir qu'il n'y a qu'un seul enregistrement avec une combinaison unique de PersonNumber et Active = 1.
Créer une contrainte unique
Après avoir supprimé tous les enregistrements en double de la table, vous pouvez ajouter une contrainte unique à l'aide de l'instruction ALTER TABLE
ou de l'instruction CREATE UNIQUE INDEX
.
ALTER TABLE
Méthode<code class="language-sql">ALTER TABLE dbo.yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
CREATE UNIQUE INDEX
Méthode<code class="language-sql">CREATE UNIQUE INDEX uq_yourtablename ON dbo.yourtablename(column1, column2);</code>
Gestion des insertions en double
Au lieu de laisser SQL Server gérer les insertions en double en renvoyant une exception, vous pouvez vérifier de manière proactive les conflits potentiels.
Pour éviter que des exceptions n'interrompent votre application, vous pouvez utiliser les méthodes suivantes :
Si vous souhaitez gérer les insertions en double sans modifier votre application, vous pouvez créer un déclencheur INSTEAD OF :
<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 'Did nothing.'; -- 或执行其他处理重复插入的逻辑 END END GO</code>
Exemple
L'exemple suivant montre la création d'une contrainte unique sur une combinaison de colonnes et la vérification de sa fonctionnalité :
<code class="language-sql">USE tempdb; GO 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 -- 成功: 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>
Cet exemple montre comment une contrainte d'unicité empêche les enregistrements en double avec la même combinaison PersonNumber et Active=1.
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!