Application de l'unicité sur plusieurs colonnes SQL Server
Souvent, l'intégrité de la base de données nécessite d'empêcher les lignes en double basées sur plusieurs valeurs de colonnes. Cet article montre comment appliquer une contrainte unique sur les colonnes PersonNumber
et Active
d'une table Person
.
Implémentation de la contrainte unique
Après avoir supprimé toutes les entrées en double préexistantes, appliquez la contrainte en utilisant l'une de ces méthodes :
ALTER TABLE
Déclaration : Ceci ajoute directement la contrainte à la table existante.
<code class="language-sql">ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person_NumberActive UNIQUE (PersonNumber, Active);</code>
CREATE UNIQUE INDEX
Déclaration : Cela crée un index unique, qui applique implicitement la contrainte d'unicité.
<code class="language-sql">CREATE UNIQUE INDEX uq_Person_NumberActive ON dbo.Person (PersonNumber, Active);</code>
Approches alternatives et optimisation
Bien que les méthodes ci-dessus soient efficaces, considérez ces améliorations :
TRY...CATCH
blocs.INSTEAD OF
Déclencheur : Un déclencheur INSTEAD OF
permet une logique d'insertion conditionnelle, empêchant les exceptions de se propager à la couche d'application. Cela offre un mécanisme de gestion des erreurs plus robuste.Exemple illustratif
Cet exemple démontre la contrainte unique en action :
<code class="language-sql">-- Create the Person table CREATE TABLE dbo.Person ( ID INT IDENTITY(1, 1) PRIMARY KEY, Name NVARCHAR(32) NOT NULL, Active BIT NOT NULL DEFAULT 0, PersonNumber INT NOT NULL ); -- Add the unique constraint ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person_NumberActive UNIQUE (PersonNumber, Active); -- Insert data INSERT INTO dbo.Person (Name, Active, PersonNumber) VALUES ('John Doe', 1, 1234); INSERT INTO dbo.Person (Name, Active, PersonNumber) VALUES ('Jane Doe', 0, 5678); -- Attempt to insert a duplicate (this will fail) INSERT INTO dbo.Person (Name, Active, PersonNumber) VALUES ('John Doe', 1, 1234);</code>
Cela garantit qu'un seul enregistrement existe pour chaque combinaison unique de statut PersonNumber
et Active
. Toute tentative d'insertion d'un doublon entraînera une erreur. N'oubliez pas de remplacer dbo.Person
par votre schéma et votre nom de table réels.
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!