Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Batasan unik Oracle dan indeks unik

Batasan dan indeks adalah entitas logis yang terpisah. Batasan unik, misalnya, terlihat di USER_CONSTRAINTS (atau ALL_CONSTRAINTS atau DBA_CONSTRAINTS ). Indeks terlihat di USER_INDEXES (atau ALL_INDEXES atau DBA_INDEXES ).

Batasan unik diberlakukan oleh indeks meskipun dimungkinkan (dan terkadang perlu) untuk menerapkan batasan unik menggunakan indeks non-unik. Batasan unik yang dapat ditangguhkan, misalnya, diberlakukan menggunakan indeks non-unik. Jika Anda membuat indeks non-unik pada kolom dan kemudian membuat batasan unik, Anda juga dapat menggunakan indeks non-unik tersebut untuk menerapkan batasan unik.

Dalam praktiknya, indeks unik bertindak sangat mirip dengan batasan unik yang tidak dapat ditangguhkan karena memunculkan kesalahan yang sama dengan yang ditimbulkan oleh batasan unik karena penerapan batasan unik menggunakan indeks. Tapi itu tidak persis sama karena tidak ada kendala. Jadi, seperti yang Anda lihat, tidak ada batasan unik sehingga Anda tidak dapat membuat batasan kunci asing yang mereferensikan kolom.

Ada kasus di mana Anda dapat membuat indeks unik sehingga Anda tidak dapat membuat batasan unik. Indeks berbasis fungsi, misalnya, yang memberlakukan keunikan bersyarat. Jika saya ingin membuat tabel yang mendukung penghapusan logis tetapi pastikan COL1 unik untuk semua baris yang tidak dihapus

SQL> ed
Wrote file afiedt.buf

  1  CREATE TABLE t (
  2    col1 number,
  3    deleted_flag varchar2(1) check( deleted_flag in ('Y','N') )
  4* )
SQL> /

Table created.

SQL> create unique index idx_non_deleted
  2      on t( case when deleted_flag = 'N' then col1 else null end);

Index created.

SQL> insert into t values( 1, 'N' );

1 row created.

SQL> insert into t values( 1, 'N' );
insert into t values( 1, 'N' )
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.IDX_NON_DELETED) violated


SQL> insert into t values( 1, 'Y' );

1 row created.

SQL> insert into t values( 1, 'Y' );

1 row created.

Tetapi jika kita berbicara tentang indeks berbasis non-fungsi yang unik, mungkin ada relatif sedikit kasus di mana lebih masuk akal untuk membuat indeks daripada membuat batasan. Di sisi lain, ada relatif sedikit kasus di mana hal itu membuat banyak perbedaan dalam praktiknya. Anda hampir tidak pernah ingin mendeklarasikan batasan kunci asing yang mereferensikan batasan unik daripada batasan kunci utama sehingga Anda jarang kehilangan sesuatu dengan hanya membuat indeks dan tidak membuat batasan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Normalisasikan data transaksi dari kolom waktu dan status menjadi menit per nilai status

  2. Perhitungan Biaya Rata-Rata Inventaris dalam SQL

  3. Spring Batch ORA-08177:tidak dapat membuat serial akses untuk transaksi ini saat menjalankan pekerjaan tunggal, tingkat isolasi SERIALIZED

  4. Bagaimana Mengubah Struktur Tabel di Oracle?

  5. Oracle - ORA-06502:PL/SQL:kesalahan numerik atau nilai (DBMS_OUTPUT)