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
.