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

Comment appliquer des contraintes uniques sur les combinaisons de colonnes dans SQL Server?

Linda Hamilton
Libérer: 2025-01-24 23:32:09
original
211 Les gens l'ont consulté

How to Enforce Unique Constraints on Column Combinations in SQL Server?

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 :

  • ID (clé primaire)
  • Nom
  • Actif
  • Numéro de personne

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 TABLEMéthode

<code class="language-sql">ALTER TABLE dbo.yourtablename
  ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
Copier après la connexion

CREATE UNIQUE INDEXMéthode

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

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.

Vérifier les conflits

Pour éviter que des exceptions n'interrompent votre application, vous pouvez utiliser les méthodes suivantes :

  • Impact sur les performances des différentes techniques de gestion des erreurs : Considérez l'impact sur les performances de diverses méthodes de gestion des erreurs.
  • Vérifiez les violations de contraintes potentielles avant d'entrer dans TRY/CATCH : Vérifiez les conflits potentiels avant d'entrer dans les blocs de gestion des exceptions afin de réduire les frais généraux.

Utilisez le déclencheur AU LIEU DE

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

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

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!

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