sql >> Databáze >  >> RDS >> PostgreSQL

Vytvořte vícesloupcový index pro posílení jedinečnosti

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 .




  1. PHP / MYSQL Přidat tlačítko do sloupce

  2. Jaké je nastavení zobrazení časové části s datem ve vývojáři Oracle PL/SQL?

  3. ERROR 2068 (HY000):Požadavek na soubor LOAD DATA LOCAL INFILE zamítnut z důvodu omezení přístupu

  4. MySQL vytváří syntaxi uložené procedury s oddělovačem