"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je empêcher les enregistrements de base de données en double en utilisant des contraintes et des déclencheurs uniques?

Comment puis-je empêcher les enregistrements de base de données en double en utilisant des contraintes et des déclencheurs uniques?

Publié le 2025-02-26
Parcourir:601

How Can I Prevent Duplicate Database Records Using Unique Constraints and Triggers?

Utilisez des contraintes uniques pour empêcher les enregistrements en double

]

Dans les opérations de base de données, il est souvent nécessaire d'assurer l'unicité de combinaisons de colonnes spécifiques. Par exemple, considérez le tableau suivant:

ID | Name | Active | PersonNumber

Ajouter des contraintes uniques aux tables existantes

] Pour ajouter une contrainte unique à une table existante, vous pouvez utiliser l'une des méthodes suivantes:

1.

alter la table dbo.yourtablename Ajouter une contrainte uq_yourtableName unique (Column1, Column2);

ALTER TABLE dbo.yourtablename
ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
Créer un index unique uq_yourtablename Sur dbo.yourtableName (Column1, Column2);

Utiliser des déclencheurs pour empêcher l'insertion répétée
CREATE UNIQUE INDEX uq_yourtablename
ON dbo.yourtablename(column1, column2);

Créer un déclencheur dbo.blockduplicateSurable Sur dbo.yourable Au lieu d'insérer COMME COMMENCER Définir NOCOUNT sur; S'il n'est pas existant ( Sélectionner 1 De inséré comme je Inner Join dbo.yourable comme t Sur I.Column1 = T.Column1 Et i.column2 = T.Column2 ) COMMENCER Insérer dbo.yourTable (Column1, Column2, ...) Sélectionnez Column1, Column2, ... depuis Inserted; FIN AUTRE COMMENCER Imprimer «Aucune action n'a été effectuée. ';; FIN FIN; ALLER

Exemple: Implémentez l'unicité pour PersonNumber et actif
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

Utilisez tempdb; ALLER Créer un tableau DBO.Serson ( ID INT Identité (1,1) Clé primaire, Nom nvarchar (32), Bit actif, PersonNumber int )); ALLER ALTER TABLE DBO.SERSON Ajouter une contrainte uq_person unique (personNumber, active); ALLER

Maintenant, toute tentative d'insertion qui viole la contrainte unique échouera avec un message d'erreur, garantissant qu'il n'y a pas d'enregistrement en double avec le même nombre de personnes et les états actifs.

imprimer 'Aucune action n'a été effectuée. L'instruction '
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
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3