programing

Oracle에서 고유 인덱스를 생성하면서 null을 무시하려면 어떻게 해야 합니까?

easyjava 2023. 6. 13. 22:53
반응형

Oracle에서 고유 인덱스를 생성하면서 null을 무시하려면 어떻게 해야 합니까?

테이블의 두 필드에 고유한 제약 조건을 작성하려고 합니다.그러나 하나가 null일 가능성이 높습니다.둘 다 null이 아닌 경우에만 고유해야 합니다(namenull이 될 수 없습니다.

create unique index "name_and_email" on user(name, email);

테이블 및 필드 이름의 의미를 무시하고, 그것이 말이 되는지 여부를 무시하십시오. - 저는 방금 몇 가지를 지어냈습니다.

이러한 필드에 null이 아닌 두 값에 대해 고유성을 적용하지만 다음과 같은 여러 항목이 있는 경우 무시하는 고유 제약 조건을 만들 수 있는 방법이 있습니까?namenull이 아닙니다.emailnull입니까?

이 질문은 SQL Server에 대한 것으로, 답이 동일하지 않기를 바랍니다.null도 허용하는 고유 제약 조건을 만들려면 어떻게 해야 합니까?

기능 기반 인덱스를 사용하여 이 작업을 수행할 수 있습니다.다음은 다음을 사용합니다.NVL2()식이 null이 아닌 경우 하나의 값을 반환하고 null인 경우 다른 값을 반환합니다.사용할 수 있습니다.CASE()대신.

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, 'apc@example.com')
  2  /

1 row created.

SQL> insert into blah values (null, 'apc@example.com')
  2  /

1 row created.

SQL> insert into blah values ('APC', 'apc@example.com')
  2  /

1 row created.

SQL> insert into blah values ('APC', 'apc@example.com')
  2  /
insert into blah values ('APC', 'apc@example.com')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.BLAH_UIDX) violated


SQL>

편집

시나리오에서는 항상 이름이 채워지므로 다음과 같은 인덱스만 필요합니다.

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

Index created.

SQL> 

아직도 얼마나 많은 사람들이 이 대답을 듣는지 모르겠지만, 적어도 최신 버전의 오라클에서는 고유 인덱스에 null을 가진 행을 여러 개 가질 수 있으며 수락된 대답은 필요하지 않습니다.

언급URL : https://stackoverflow.com/questions/1374737/how-can-i-create-a-unique-index-in-oracle-but-ignore-nulls

반응형