sql >> Databasteknik >  >> RDS >> Oracle

Oracles unika begränsning och unika index

En begränsning och ett index är separata logiska enheter. En unik begränsning, till exempel, är synlig i USER_CONSTRAINTS (eller ALL_CONSTRAINTS eller DBA_CONSTRAINTS ). Ett index är synligt i USER_INDEXES (eller ALL_INDEXES eller DBA_INDEXES ).

En unik restriktion upprätthålls av ett index även om det är möjligt (och ibland nödvändigt) att upprätthålla en unik restriktion med ett icke-unikt index. En uppskjutbar unik begränsning, till exempel, upprätthålls med hjälp av ett icke-unikt index. Om du skapar ett icke-unika index på en kolumn och sedan skapar en unik begränsning, kan du också använda det icke-unika indexet för att genomdriva den unika begränsningen.

I praktiken fungerar ett unikt index mycket som en unik, icke-uppskjutbar begränsning genom att den ger samma fel som en unik begränsning ger eftersom implementeringen av unika begränsningar använder indexet. Men det är inte riktigt samma sak eftersom det inte finns några begränsningar. Så, som du har sett, finns det ingen unik begränsning så du kan inte skapa en främmande nyckel begränsning som refererar till kolumnen.

Det finns fall där du kan skapa ett unikt index som du inte kan skapa en unik begränsning. Ett funktionsbaserat index, till exempel, som upprätthåller villkorlig unikhet. Om jag ville skapa en tabell som stödde logiska raderingar men se till att COL1 är unik för alla rader som inte har tagits bort

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.

Men om vi pratar om ett rakt unikt icke-funktionsbaserat index, finns det förmodligen relativt få fall där det verkligen är mer meningsfullt att skapa indexet snarare än att skapa begränsningen. Å andra sidan är det relativt få fall där det gör stor skillnad i praktiken. Du skulle nästan aldrig vilja deklarera en främmande nyckelrestriktion som refererade till en unik restriktion snarare än en primärnyckelrestriktion, så du förlorar sällan något genom att bara skapa indexet och inte skapa restriktionen.



  1. 7 bästa praxis-tips för PostgreSQL-bulkdataladdning

  2. De 8 mest populära databaserna

  3. Effektiv övervakning av MySQL med SCUMM Dashboards:Del 3

  4. Migrera en Oracle-databas till MySQL på AWS, del 1