Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Unikalne ograniczenie Oracle i unikalny indeks

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ustawienie NLS_NUMERIC_CHARACTERS dla dziesiętnych

  2. Klastry zliczające SQL Oracle

  3. Równoległe wywołania w PL/SQL

  4. Jak zweryfikować numer karty kredytowej i zidentyfikować jej typ za pomocą PL/SQL?

  5. Oracle:Połącz wiele wyników w podzapytaniu w jedną wartość oddzieloną przecinkami