web-dev-qa-db-fra.com

Index unique / contrainte avec plusieurs colonnes, une colonne est nullable

Mes questions sont de savoir s'il est possible d'avoir un indice unique composé de multiples colonnes lorsque l'une des colonnes peut contenir NULL.

Exemple: une table nommée 'réglementation_person' a un certain nombre de colonnes, dont LAST_NAME, FIRST_NAME, BIRTH_DATE et ALIAS. Le type de données pour BIRTH_DATE est date, pour les autres, cordes/VARCHAR. LAST_NAME, FIRST_NAME et BIRTH_DATE ne sont pas nullables, c'est-à-dire qu'ils ont besoin de valeurs. ALIAS sert de cravate pour des cas où deux personnes ou plus ont les mêmes prénoms/derniers noms et naissent le même jour. Parce que les situations de cravate ne sont pas courantes, je veux éviter la nécessité de fournir une valeur ALIAS à moins que ce soit nécessaire.

À titre d'arrière-plan, la clé primaire de la table est traitée par un générateur d'incrément automatique. Le but de l'index unique est de fournir une "clé d'entreprise" qui identifiera la ligne sans avoir à recourir à la clé primaire. Je travaille avec MySQL 5.1.35 et Hibernate ORM Ver. 4.3.10.

Toute suggestion quant aux fournisseurs de serveurs/bases de données à part MySQL serait la bienvenue.

Merci d'avance pour tout orientation, ainsi que des excuses à l'avance pour toute violation inattendue du "protocole du forum", comme c'est la première fois que je soumis une question n'importe où.

4
jfr

Comme la colonne alias est nullable, si vous ajoutez une contrainte unique sur le composite (last_name, first_name, birth_date, alias), il y aura toujours des doublons autorisés, avec les mêmes valeurs dans les 3 premières colonnes et NULL dans le alias. La contrainte est ignorée/acceptée lorsque au moins une valeur est null. Documentation MySQL sur CREATE TABLE n'est pas très clair mais vous pouvez tester le comportement:

  • Un indice UNIQUE crée une contrainte de telle sorte que toutes les valeurs de l'index soient distinctes. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne avec une valeur clé correspondant à une ligne existante. Pour tous les moteurs, a UNIQUE indice permet de multiples valeurs NULL pour les colonnes pouvant contenir NULL .

Ce que vous pouviez faire est de définir le alias comme not null et ajouter une valeur default (dites 'NONE' ou alors 'DEFAULT' ou la chaîne vide ''). Vous n'aurez pas à fournir cette valeur, il sera automatiquement enregistré dans toutes les lignes. Une fois que quelqu'un tente d'ajouter une nouvelle ligne avec le même nom de famille, le prénom et la date de naissance en tant que ligne existante, la contrainte unique sera interdire. Je suppose que vous pouvez ajouter une procédure à ce stade, qui demande une valeur différente pour le alias et ajoute la nouvelle ligne avec elle.

3
ypercubeᵀᴹ