sql >> Database teknologi >  >> RDS >> Oracle

Oracle unik begrænsning og unikt indeks

En begrænsning og et indeks er separate logiske enheder. En unik begrænsning er for eksempel synlig i USER_CONSTRAINTS (eller ALL_CONSTRAINTS eller DBA_CONSTRAINTS ). Et indeks er synligt i USER_INDEXES (eller ALL_INDEXES eller DBA_INDEXES ).

En unik begrænsning håndhæves af et indeks, selvom det er muligt (og nogle gange nødvendigt) at håndhæve en unik begrænsning ved hjælp af et ikke-unik indeks. En unik begrænsning, der kan udskydes, håndhæves f.eks. ved hjælp af et ikke-unikt indeks. Hvis du opretter et ikke-unik indeks på en kolonne og efterfølgende opretter en unik begrænsning, kan du også bruge det ikke-unikke indeks til at håndhæve den unikke begrænsning.

I praksis fungerer et unikt indeks meget som en unik, ikke-udskydelig begrænsning, idet det rejser den samme fejl, som en unik begrænsning rejser, da implementeringen af ​​unikke begrænsninger bruger indekset. Men det er ikke helt det samme, fordi der ikke er nogen begrænsning. Så, som du har set, er der ingen unik begrænsning, så du kan ikke oprette en fremmednøgle begrænsning, der refererer til kolonnen.

Der er tilfælde, hvor du kan oprette et unikt indeks, som du ikke kan oprette en unik begrænsning. Et funktionsbaseret indeks, for eksempel, der håndhæver betinget unikhed. Hvis jeg ønskede at oprette en tabel, der understøttede logiske sletninger, men sørg for at COL1 er unik for alle ikke-slettede rækker

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 hvis vi taler om et lige unikt ikke-funktionsbaseret indeks, er der sandsynligvis relativt få tilfælde, hvor det virkelig giver mere mening at oprette indekset i stedet for at skabe begrænsningen. Til gengæld er der relativt få tilfælde, hvor det gør en stor forskel i praksis. Du ønsker næsten aldrig at erklære en fremmednøglebegrænsning, der refererer til en unik begrænsning snarere end en primærnøglebegrænsning, så du mister sjældent noget ved kun at oprette indekset og ikke oprette begrænsningen.



  1. Skift primær nøgle

  2. Forudbygget Oracle-database til læring og test ved hjælp af Oracle Developer VM

  3. Split funktion i oracle til kommaseparerede værdier med automatisk sekvens

  4. FLOSS UK forårskonference