Zdá se, že jde o nedorozumění.
Vaše citace z mé odpovědi je trochu zavádějící, protože platí pouze v případě, že vytvoříte také další dílčí index, jak je zde popsáno:
Jak přidat podmíněný jedinečný index na PostgreSQL
Pokud tento druhý index nepřidáte (jako vy), již máte své řešení , Zdálo by se. Pouze pomocí vícesloupcového jedinečného indexu můžete zadat (1, NULL)
vícekrát, ale (1,2)
nebo (1,3)
pouze jednou.
Prázdné řetězce
Pokud jste omylem uvažovali o prázdných řetězcích (''
) (pro typ znaku
) namísto NULL
hodnoty:s nimi se zachází jako s jakoukoli jinou hodnotou. Mohli byste řešit tuto situaci pomocí vícesloupcového, částečně funkčního unikátního indexu (index u výrazu
):
CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));
Tímto způsobem můžete zadat (1, 'a')
, (1, 'b')
pouze jednou.
Ale (1, NULL)
a (1, '')
několikrát.
Nežádoucí účinky
Index by stále plně podporoval prosté dotazy na první sloupec (tat
).
Dotazy v obou sloupcích by ale musely odpovídat výrazu, aby byl využit plný potenciál. Bylo by to rychlejší, i když se zdá, že to nedává smysl:
SELECT * FROM predictions
WHERE tat = 1
AND NULLIF(dim, '') = 'foo';
.. než toto:
SELECT * FROM predictions
WHERE tat = 1
AND dim = 'foo';
.. protože první dotaz může používat oba indexové sloupce. Výsledek by byl stejný (s výjimkou hledání ''
nebo NULL
). Podrobnosti v této související odpovědi na dba.SE
.