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ù.
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, aUNIQUE
indice permet de multiples valeursNULL
pour les colonnes pouvant contenirNULL
.
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.