Maison >base de données >tutoriel mysql >Comment puis-je empêcher les enregistrements de base de données en double à l'aide de contraintes et de déclencheurs uniques ?

Comment puis-je empêcher les enregistrements de base de données en double à l'aide de contraintes et de déclencheurs uniques ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-24 23:41:09869parcourir

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

en utilisant la contrainte unique pour empêcher les enregistrements répétés

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

Vous devrez peut-être forcer la mise en œuvre d'une contrainte unique pour empêcher la duplication basée sur PersonNumber et Active = 1 combinaison. Cela garantit qu'il n'y a pas deux lignes avec le même nombre de personnes et le même statut actif.
<code>ID | Name | Active | PersonNumber</code>

Ajoutez la contrainte unique à la table existante

Pour ajouter des contraintes uniques au tableau existant, vous pouvez utiliser l'une des méthodes suivantes:

<.> 1. Utilisez la table alter unique

<.> 2. Créez le seul index

<code>ALTER TABLE dbo.yourtablename
ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>

Utilisez le déclencheur pour empêcher l'insertion répétée

Si vous souhaitez empêcher l'insertion répétée sans compter sur des anomalies, vous pouvez utiliser le déclencheur au lieu. Ce déclencheur interceptera les tentatives d'insertion et n'autorise l'insertion que lorsqu'il ne viole pas la seule contrainte:
<code>CREATE UNIQUE INDEX uq_yourtablename
ON dbo.yourtablename(column1, column2);</code>

Exemple: Implémentez l'unicité de PersonNumber et actif

L'exemple suivant montre comment la combinaison de PersonNumber et active dans le tableau des personnes ajoute des contraintes uniques:

<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>

Maintenant, toutes les tentatives d'insertion qui violent les contraintes uniques échoueront et affichent des messages d'erreur pour s'assurer qu'il n'y a pas d'enregistrement répété avec le même nombre de personnes et le même état actif. L'instruction remplace le dans le texte d'origine, ce qui facilite la compréhension.

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!

Déclaration:
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