Oracle: Function based unique index

Adatbázisokkal kapcsolatos cikkek / Oracle (1897 katt)

Az Oracle adatbázisban létrehozhatunk olyan indexeket, amelyekben nem csak egy tábla oszlopai, hanem kifejezések és függvények is szerepelnek (function based indexes). Ezzel a módszerrel nem csak a lekérdezéseket lehet felgyorsítani, hanem speciálisan megfogalmazott egyediségi feltételeket is ki lehet kényszeríteni.

Hozzunk létre teszt céljából egy új Oracle táblát:

create table unique_test
(test_id integer,
test_type integer not null,
test_name varchar2(80) not null,

primary key (test_id));



Legyen az a feltétel, hogy ha a test_type = 1, akkor a test_name értéke legyen egyedi a táblában. Ha a test_type <> 1, akkor a test_name egy adott értéke akárhányszor ismétlődhet.

Hozzuk létre a következő unique indexet:

create unique index unique_test_u1
on unique_test
(case test_type when 1 then test_name else null end);



Ezek után a következő utasítások probléma nélkül le fognak futni:

insert into unique_test (test_id, test_type, test_name) values (1, 1, 'A');
insert into unique_test (test_id, test_type, test_name) values (2, 2, 'B');
insert into unique_test (test_id, test_type, test_name) values (3, 3, 'C');

commit;



Ez az utasítás is működni fog, pedig a 'B' név ismétlődik a 2-es típuson belül:

insert into unique_test (test_id, test_type, test_name) values (4, 2, 'B');

commit;



Ha viszont ezt az utasítást adjuk ki:

insert into unique_test (test_id, test_type, test_name) values (5, 1, 'A');



akkor az ORA-00001: a(z) (XXX.UNIQUE_TEST_U1) egyediségre vonatkozó megszorítás nem teljesül hibaüzenetet kapjuk, azaz az index nem engedi az 1-es típuson belüli ismétlődést.

Előző oldal Kapitány