Oracle
 sql >> база данни >  >> RDS >> Oracle

Уникално ограничение на Oracle и уникален индекс

Ограничението и индексът са отделни логически единици. Уникално ограничение, например, се вижда в USER_CONSTRAINTS (или ALL_CONSTRAINTS или DBA_CONSTRAINTS ). Индексът се вижда в USER_INDEXES (или ALL_INDEXES или DBA_INDEXES ).

Уникалното ограничение се налага от индекс, въпреки че е възможно (а понякога и необходимо) да се наложи уникално ограничение с помощта на неуникален индекс. Отлагаемо уникално ограничение, например, се прилага с помощта на неуникален индекс. Ако създадете неуникален индекс върху колона и впоследствие създадете уникално ограничение, можете също да използвате този неуникален индекс, за да наложите уникалното ограничение.

На практика уникалният индекс действа много подобно на уникално ограничение, което не може да се отложи, тъй като поражда същата грешка, която поражда уникалното ограничение, тъй като прилагането на уникални ограничения използва индекса. Но не е съвсем същото, защото няма ограничение. Така че, както видяхте, няма уникално ограничение, така че не можете да създадете ограничение за външен ключ, което препраща към колоната.

Има случаи, в които можете да създадете уникален индекс, който не можете да създадете уникално ограничение. Базиран на функция индекс, например, който налага условна уникалност. Ако исках да създам таблица, която поддържа логически изтривания, но гарантира, че COL1 е уникален за всички неизтрити редове

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.

Но ако говорим за прав уникален нефункционален индекс, вероятно има сравнително малко случаи, в които наистина има по-голям смисъл да се създаде индексът, вместо да се създава ограничението. От друга страна, има сравнително малко случаи, когато това има голяма разлика на практика. Почти никога не бихте искали да декларирате ограничение за външен ключ, което се позовава на уникално ограничение, а не на ограничение на първичен ключ, така че рядко губите нещо, като създавате само индекса, а не създавате ограничението.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ODP.NET Oracle.ManagedDataAccess причинява края на мрежовата сесия ORA-12537 на файла

  2. как да зададете колона за автоматично увеличение с sql разработчик

  3. Membership.ValidateUser винаги връща false след надстройка до VS 2010 / .NET 4.0

  4. Как да използвам тип таблица в оператор SELECT FROM?

  5. Задействания за превенция