Похоже, у вас происходит какая-то форма отношения подтип / супертип.Типичным примером является «PERSON», который может быть «CUSTOMER» или «SUPPLIER».
В таблице PERSON может быть уникальный ключ PERSON_ID плюс атрибут PERSON_TYPE («CUST» или'SUPP').Если вы создаете первичный ключ для PERSON_ID, PERSON_TYPE, вы можете ссылаться на него в таблицах подтипов (SUPPLIER / CUSTOMER).
Затем вы добавляете уникальное ограничение на person_id, чтобы гарантировать, что любое значение person_id должно быть либо клиентом, либо поставщиком, но не обоими, и проверяете ограничения на таблицы подтипов, чтобы в таблице был представлен только один тип..
create table person
(person_id number,
person_type varchar2(4),
name varchar2(10),
constraint person_pk primary key (person_id, person_type),
constraint person_id_uk unique (person_id));
create table supplier
(supplier_id number,
supplier_type varchar2(4),
blah varchar2(10),
constraint supplier_pk primary key (supplier_id, supplier_type),
constraint supp_pers_fk foreign key (supplier_id, supplier_type)
REFERENCES person (person_id, person_type)
)
/
alter table supplier add constraint supp_type_ck check (supplier_type = 'SUPP');
Это не красиво, но типы / подтипы - это скорее объектная концепция, чем реляционная.