sql >> Databáze >  >> RDS >> Oracle

Jedinečné omezení Oracle a jedinečný index

Omezení a index jsou samostatné logické entity. Jedinečné omezení je například viditelné v USER_CONSTRAINTS (nebo ALL_CONSTRAINTS nebo DBA_CONSTRAINTS ). Index je viditelný v USER_INDEXES (nebo ALL_INDEXES nebo DBA_INDEXES ).

Jedinečné omezení je vynuceno indexem, ačkoli je možné (a někdy nutné) vynutit jedinečné omezení pomocí nejedinečného indexu. Odložitelné jedinečné omezení je například vynuceno pomocí nejedinečného indexu. Pokud vytvoříte nejedinečný index pro sloupec a následně vytvoříte jedinečné omezení, můžete tento nejedinečný index také použít k vynucení jedinečného omezení.

V praxi se jedinečný index chová velmi podobně jako jedinečné, neodložitelné omezení v tom, že vyvolává stejnou chybu, jakou vyvolává jedinečné omezení, protože implementace jedinečných omezení používá index. Ale není to úplně totéž, protože neexistuje žádné omezení. Takže, jak jste viděli, neexistuje žádné jedinečné omezení, takže nemůžete vytvořit omezení cizího klíče, které odkazuje na sloupec.

Existují případy, kdy můžete vytvořit jedinečný index, u kterého nelze vytvořit jedinečné omezení. Například index založený na funkcích, který vynucuje podmíněnou jedinečnost. Pokud bych chtěl vytvořit tabulku, která by podporovala logické mazání, ale ujistěte se, že COL1 je jedinečný pro všechny nesmazané řádky

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 pokud mluvíme o přímém jedinečném indexu nezaloženém na funkcích, existuje pravděpodobně relativně málo případů, kdy opravdu dává větší smysl index vytvořit, než vytvořit omezení. Na druhou stranu je relativně málo případů, kdy je to v praxi hodně rozdílné. Téměř nikdy byste nechtěli deklarovat omezení cizího klíče, které odkazovalo na jedinečné omezení spíše než na omezení primárního klíče, takže jen zřídka něco ztratíte tím, že vytvoříte pouze index a nevytvoříte omezení.



  1. VYTVOŘIT postup Oracle

  2. Funkce REMAINDER() v Oracle

  3. Připojení Orbeon Forms Postgres DB

  4. Jak funguje funkce Ln() v PostgreSQL