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
Libérer: 2025-01-24 23:41:09
original
811 Les gens l'ont consulté

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

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

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

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

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!

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