sql >> Databáze >  >> RDS >> Oracle

Jak mohu vytvořit jedinečný index v Oracle, ale ignorovat hodnoty null?

Můžeme to udělat pomocí indexu založeného na funkcích. Následující text využívá NVL2() který, jak víte, vrací jednu hodnotu, pokud výraz není null, a jinou hodnotu, pokud je null. Můžete použít CASE() namísto.

SQL> create table blah (name varchar2(10), email varchar2(20))
  2  /

Table created.

SQL> create unique index blah_uidx on blah
  2      (nvl2(email, name, null), nvl2(name, email, null))
  3  /

Index created.

SQL> insert into blah values ('APC', null)
  2  /

1 row created.

SQL> insert into blah values ('APC', null)
  2  /

1 row created.

SQL> insert into blah values (null, '[email protected]')
  2  /

1 row created.

SQL> insert into blah values (null, '[email protected]')
  2  /

1 row created.

SQL> insert into blah values ('APC', '[email protected]')
  2  /

1 row created.

SQL> insert into blah values ('APC', '[email protected]')
  2  /
insert into blah values ('APC', '[email protected]')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.BLAH_UIDX) violated


SQL>

Upravit

Protože ve vašem scénáři bude vždy vyplněn název, budete potřebovat pouze takový index:

SQL> create unique index blah_uidx on blah
  2      (nvl2(email, name, null), email)
  3  /

Index created.

SQL> 


  1. Laravel:Osévání více jedinečných sloupců pomocí Faker

  2. index na adrese URL nebo hash s ohledem na RAM

  3. Může se mohutnost lišit pro duplicitní indexy v mysql?

  4. Jaký je rozdíl mezi UNIQUE, UNIQUE KEY a CONSTRAINT 'name' UNIQUE?