sql >> Database >  >> RDS >> Oracle

Hoe kan ik een unieke index in Oracle maken, maar nulls negeren?

We kunnen dit doen met een functiegebaseerde index. Het volgende maakt gebruik van NVL2() die, zoals u weet, één waarde retourneert als de uitdrukking niet null is en een andere waarde als deze null is. Je zou CASE() . kunnen gebruiken in plaats van.

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>

Bewerken

Omdat in uw scenario de naam altijd wordt ingevuld, heeft u alleen een index als deze nodig:

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

Index created.

SQL> 


  1. (1/1) MethodeNiet toegestaanHttpUitzondering

  2. Hoe verbinding maken met MySQL met behulp van UTF8 in een perl-script?

  3. Gegevens van PHP-formulier worden niet naar mySQL gepost

  4. Dynamische kolomalias op basis van kolomwaarde