2016-07-20 3 views
1

Возможно ли установить уникальные/внешние ключи в ссылочных полях при использовании объектов SQL? Например, если у меня есть следующая таблица:Oracle SQL Objects - уникальный/внешний ключ по ссылкам

create table MY_TABLE (
    SOME_REFERENCE ref MY_TYPE 
); 

Могу ли я установить уникальный ключ на ссылку? Что-то вроде этого:

alter table MY_TABLE modify (constraint ABC unique(SOME_REFERENCE)) 

(Который дает ORA-02329: column of datatype REF cannot be unique or a primary key)

Можно ли для того чтобы достигнуть что-то вроде уникальные/внешние ключи на ссылочных полей (Может быть, используя обходные пути?)

ответ

1

Существует обходной путь, но это сложно.

create type my_type as object 
(id number, v varchar2(20)); 

create table my_type_table of my_type; 

insert into my_type_table values(1,'a'); 

create table MY_TABLE (
    SOME_REFERENCE ref MY_TYPE 
); 

create or replace function test_func(p_ref ref MY_TYPE) return number DETERMINISTIC 
is 
    v_typ MY_TYPE; 
begin 
    SELECT DEREF(p_ref) INTO v_typ FROM DUAL; 
    return v_typ.id; 
end; 

CREATE UNIQUE INDEX fn_idx_un ON MY_TABLE (test_func(SOME_REFERENCE)); 

И тест.

insert into my_type_table values(1,'a'); 
insert into MY_TABLE SELECT REF(e) FROM my_type_table e; (*1) 
insert into MY_TABLE SELECT REF(e) FROM my_type_table e; (*2) 

* 1 - работает нормально, а ряд вставлен.

* 2 - осуществление - поднят. ORA-00001: unique constraint (FN_IDX_UN) violated

+0

Спасибо, это то, что я ищу! Есть ли способ добиться чего-то подобного для внешних ключей? – tobspr

Смежные вопросы