PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Créer un index multicolonne pour renforcer l'unicité

Cela semble être un malentendu.

Votre citation de ma réponse est un peu trompeuse, car elle ne s'applique que si vous créez également l'index partiel supplémentaire comme décrit ici :
Comment ajouter un index unique conditionnel sur PostgreSQL

Si vous n'ajoutez pas ce deuxième index (comme vous ne l'avez pas fait), vous avez déjà votre solution , il semblerait. Avec l'index unique multicolonne seul, vous pouvez saisir (1, NULL) plusieurs fois, mais (1,2) ou (1,3) une seule fois.

Chaînes vides

Si, par erreur, vous considériez des chaînes vides ('' ) (pour un type de caractère ) au lieu de NULL valeurs :celles-ci sont traitées comme n'importe quelle autre valeur. Vous pourriez gérer cette situation à l'aide d'un index unique multicolonne partiellement fonctionnel (index sur une expression ):

CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));

De cette façon, vous pouvez saisir (1, 'a') , (1, 'b') une seule fois.
Mais (1, NULL) et (1, '') plusieurs fois.

Effets secondaires

L'index prendrait toujours entièrement en charge les requêtes simples sur la première colonne (tat ).
Mais les requêtes sur les deux colonnes doivent correspondre à l'expression pour exploiter tout le potentiel. Ce serait plus rapide, même si cela ne semble pas logique :

SELECT * FROM predictions
WHERE  tat = 1
AND    NULLIF(dim, '') = 'foo';

.. que ceci :

SELECT * FROM predictions
WHERE  tat = 1
AND    dim = 'foo';

.. car la première requête peut utiliser les deux colonnes d'index. Le résultat serait le même (sauf lors de la recherche de '' ou NULL ). Détails dans cette réponse connexe sur dba.SE .