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

Přidejte omezení, aby byl sloupec jedinečný pro skupinu řádků

Líbí se mi komentář<34495025">komentář2 /a> , status by měl být skutečně boolean . Levnější, čistší.

V obou případech můžete pravidlo uložit pomocí částečného jedinečného indexu :

Chcete-li povolit žádný nebo jeden řádek s status = 'Active' v celé tabulce :

CREATE UNIQUE INDEX tbl_active_uni ON tbl (status)
WHERE status = 'Active';

Chcete-li povolit žádný nebo jeden řádek s status = 'Active' za userid , vytvořte userid indexovaný sloupec:

CREATE UNIQUE INDEX tbl_userid_active_uni ON tbl (userid)
WHERE status = 'Active';

Všimněte si, že userid IS NULL nespustí jedinečná porušení, protože dvě hodnoty NULL nejsou nikdy považovány za stejné. userid musí být nastaveno NOT NULL v tomto případě.

Proč indexovat a ne omezovat?

Adresa CONSTRAINT .

Index pro první případ je titěrný , obsahující jeden nebo žádný řádek.
Index pro druhý případ obsahuje jeden řádek na existující userid , ale je to nejlevnější a nejrychlejší způsob , kromě toho, že je čistý a bezpečný. Aby to bylo rychlé, budete v každém případě potřebovat index ke kontrole ostatních řádků.

Nemůžete mít CHECK kontrola omezení na jiných řádcích - alespoň ne čistým a spolehlivým způsobem. Existují způsoby, které bych určitě nedoporučoval pro tento případ:

Pokud používáte UNIQUE omezení na (userid, status) (který je také implementován s jedinečným indexem na pozadí!), nemůžete jej učinit částečným a všechny kombinace jsou nuceny být jedinečné. Mohli byste stále jej používejte, pokud pracujete s status IS NULL pro všechny případy kromě 'Active' případ. Ale to by ve skutečnosti znamenalo mnohem větší index včetně všech řádky.




  1. Oracle MERGE a připravené prohlášení

  2. Hibernate Query problém s Informix

  3. Dotaz na více tabulek – zobrazení názvu týmu na základě ID týmu

  4. Jak získat všechny odlišné kombinace 2 sloupců v MySQL