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.
Bien que les déclencheurs puissent y parvenir, une solution plus efficace et plus robuste consiste à utiliser 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.
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>
Cela crée un index unique sur la colonne ID
, mais ne prend en compte que les lignes où RecordStatus
est égal à 1.
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>
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!