Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để tạo một chỉ mục duy nhất trong Oracle nhưng lại bỏ qua các chỉ mục rỗng?

Chúng ta có thể làm điều này với một chỉ mục dựa trên chức năng. Phần sau sử dụng NVL2() như bạn đã biết, trả về một giá trị nếu biểu thức không null và một giá trị khác nếu nó là null. Bạn có thể sử dụng CASE() thay vì.

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>

Chỉnh sửa

Bởi vì trong tên kịch bản của bạn sẽ luôn được điền, bạn sẽ chỉ cần một chỉ mục như sau:

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

Index created.

SQL> 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để gọi hàm Oracle hoặc thủ tục được lưu trữ bằng cách sử dụng khuôn khổ bền vững mùa xuân?

  2. Tôi có thể vô hiệu hóa một trình kích hoạt bên trong một trình kích hoạt trong oracle không?

  3. Nhận các giá trị liên quan đến các hàng tối đa và tối thiểu trong Oracle

  4. Sự khác biệt ngầm định của luồng dữ liệu CAST so với ssis

  5. Nhà phát triển SQL tinh chỉnh chế độ xem kết nối