Ograniczenie i indeks to oddzielne jednostki logiczne. Unikalne ograniczenie, na przykład, jest widoczne w USER_CONSTRAINTS
(lub ALL_CONSTRAINTS
lub DBA_CONSTRAINTS
). Indeks jest widoczny w USER_INDEXES
(lub ALL_INDEXES
lub DBA_INDEXES
).
Unikatowe ograniczenie jest wymuszane przez indeks, chociaż możliwe jest (a czasami konieczne) wymuszenie unikatowego ograniczenia przy użyciu nieunikalnego indeksu. Na przykład ograniczenie unikatowości, które można odroczyć, jest wymuszane przy użyciu nieunikalnego indeksu. Jeśli utworzysz indeks nieunikatowy w kolumnie, a następnie utworzysz ograniczenie unikatowe, możesz również użyć tego indeksu nieunikatowego, aby wymusić ograniczenie unikatowe.
W praktyce unikalny indeks działa bardzo podobnie do unikalnego ograniczenia, którego nie można odroczyć, ponieważ powoduje ten sam błąd, który powoduje unikatowe ograniczenie, ponieważ implementacja unikalnych ograniczeń używa indeksu. Ale to nie to samo, ponieważ nie ma ograniczeń. Tak więc, jak widziałeś, nie ma unikatowego ograniczenia, więc nie możesz utworzyć ograniczenia klucza obcego, które odwołuje się do kolumny.
Istnieją przypadki, w których można utworzyć unikalny indeks, w którym nie można utworzyć unikalnego ograniczenia. Na przykład indeks oparty na funkcji, który wymusza warunkową unikatowość. Gdybym chciał utworzyć tabelę obsługującą usuwanie logiczne, ale upewnij się, że COL1
jest unikalny dla wszystkich nieusuniętych wierszy
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.
Ale jeśli mówimy o prostym, unikalnym indeksie nie opartym na funkcjach, prawdopodobnie jest stosunkowo niewiele przypadków, w których naprawdę bardziej sensowne jest tworzenie indeksu niż tworzenie ograniczenia. Z drugiej strony jest stosunkowo niewiele przypadków, w których ma to duże znaczenie w praktyce. Prawie nigdy nie chciałbyś deklarować ograniczenia klucza obcego, które odwołuje się do ograniczenia unikatowego, a nie do ograniczenia klucza podstawowego, więc rzadko coś tracisz, tworząc tylko indeks, a nie tworząc ograniczenie.