Maison > base de données > tutoriel mysql > Comment puis-je créer une contrainte unique sur une colonne de tableau uniquement lorsqu'une condition spécifique est remplie ?

Comment puis-je créer une contrainte unique sur une colonne de tableau uniquement lorsqu'une condition spécifique est remplie ?

DDD
Libérer: 2025-01-10 10:44:43
original
332 Les gens l'ont consulté

How Can I Create a Unique Constraint on a Table Column Only When a Specific Condition is Met?

Mise en œuvre de l'unicité conditionnelle : une alternative supérieure aux déclencheurs

Souvent, la conception de bases de données nécessite des contraintes uniques sur les colonnes des tables, mais uniquement dans des circonstances spécifiques. Illustrons cela avec un exemple :

Considérons un tableau Table avec les colonnes ID, Name et RecordStatus. RecordStatus peut être 1 (actif) ou 2 (supprimé). L'objectif est d'appliquer l'unicité sur la colonne ID uniquement pour les enregistrements actifs (où RecordStatus = 1), autorisant les doublons pour les enregistrements supprimés.

Pourquoi éviter les déclencheurs ?

Bien que les déclencheurs puissent y parvenir, une solution plus efficace et plus robuste consiste à utiliser des index filtrés.

La puissance des index filtrés

Les index filtrés créent des index sur un sous-ensemble de données de table, défini par une condition de filtre. Cela permet un contrôle précis de l'indexation, idéal pour les contraintes conditionnelles uniques ou de clé primaire.

Création de la contrainte unique conditionnelle

Pour appliquer l'unicité sur ID uniquement lorsque RecordStatus vaut 1, utilisez cette commande :

<code class="language-sql">CREATE UNIQUE INDEX MyIndex ON MyTable(ID) WHERE RecordStatus = 1;</code>
Copier après la connexion

Cela crée un index unique sur la colonne ID, mais ne prend en compte que les lignes où RecordStatus est égal à 1.

Comportement attendu

Tenter d'insérer une valeur ID en double avec RecordStatus = 1 entraînera une erreur similaire à celle-ci :

<code>Msg 2601, Level 14, State 1, Line 13
Cannot insert duplicate key row in object 'dbo.MyTable' with unique index 'MyIndex'. The duplicate key value is (9999).</code>
Copier après la connexion

Résumé

Les index filtrés offrent une approche propre et efficace pour créer des contraintes conditionnelles uniques. Ils améliorent l'intégrité des données sans la surcharge de performances souvent associée aux déclencheurs, offrant ainsi une solution plus évolutive et plus maintenable pour les exigences de bases de données complexes. En définissant précisément la condition du filtre, vous pouvez appliquer de manière sélective l'unicité, en vous alignant parfaitement sur des règles métier spécifiques.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal