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.