Создание условного индекса на основе значения столбца - PullRequest
0 голосов
/ 09 мая 2019
Table1
___________
User_ID
Location_ID
Type_ID
Level_ID

Levels
_________
1111    Manager
2222    Staff

Существует существующее ограничение на User_ID и Category_ID. Мне нужно добавить ограничение, чтобы гарантировать, что только один пользователь уровня Manager можно добавить в локацию для каждого типа.

Как мне создать уникальный индекс для Location_ID, Type_ID и Level_ID, где level_id = mypackage.get_level_id ('Manager')?

Я пытаюсь что-то подобное:

CREATE UNIQUE INDEX idx_mgr on Table1 (CASE WHEN Level_id=mypackage.get_level_id('Manager') 
                    THEN (Location_ID,Type_ID)
                    ELSE NULL
                END);

или

CREATE UNIQUE INDEX idx_mgr ON (DECODE(Level_ID,mypackage.get_level_id('Manager'),NULL);

Как мне заставить что-то подобное работать?

1 Ответ

1 голос
/ 09 мая 2019

Определяя индекс функции только для уровня управления (ссылаясь на константу напрямую - не через пакет), вы получаете требуемое поведение:

create unique index ix1 on table1
 (case when level_id = 1111 then Location_ID end, case when level_id = 1111 then Type_ID end);

Вы можете вставить любое количество вещей с одинаковым расположением и типом, но только с одним менеджером:

insert into table1(User_ID,Location_ID, Type_ID, Level_ID) values(1,1,1,2222); 
insert into table1(User_ID,Location_ID, Type_ID, Level_ID) values(2,1,1,2222);
insert into table1(User_ID,Location_ID, Type_ID, Level_ID) values(3,1,1,1111);
insert into table1(User_ID,Location_ID, Type_ID, Level_ID) values(4,1,1,1111);
-- fails with ORA-00001: Unique Constraint violated 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...