Maison > base de données > tutoriel mysql > Comment appliquer des contraintes uniques sur plusieurs colonnes dans SQL Server?

Comment appliquer des contraintes uniques sur plusieurs colonnes dans SQL Server?

Linda Hamilton
Libérer: 2025-01-24 23:37:12
original
391 Les gens l'ont consulté

How to Enforce Unique Constraints on Multiple Columns in SQL Server?

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>
Copier après la connexion

Vous pouvez également créer un index unique :

<code class="language-sql">CREATE UNIQUE INDEX uq_yourtablename ON dbo.yourtablename(column1, column2);</code>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal