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:
- Omezení spouštění vs. kontrola
- Jak se vyhnout cyklické závislosti (kruhové reference) mezi 3 tabulkami?
- Deaktivujte všechna omezení a kontroly tabulek při obnově výpisu
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.