Похоже, у вас есть некоторая форма отношений подтипа/супертип происходит. Типичным примером является «ПЕРСОН», который может быть либо «ЗАКАЗЧИКОМ», либо «ПОСТАВЩИКОМ».
Возможно, в таблице ПЕРСОНА есть уникальный ключ PERSON_ID плюс атрибут PERSON_TYPE ('CUST' или 'SUPP'). Если вы создаете первичный ключ на PERSON_ID, PERSON_TYPE, вы можете ссылаться на это в таблицах подтипов (ПОСТАВЩИК/ЗАКАЗЧИК).
Затем вы добавляете уникальное ограничение на 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');
Его не очень, но типы/подтипы являются скорее концепцией объекта, чем реляционной.
Oracle версии? – DCookie 2010-12-02 19:06:01
@DCookie: 10gR2 – dacracot 2010-12-02 20:03:08
@OMG Ponies: Ошибка при запуске в строке 1 в команде: альтер таблица А добавить ограничение BorCkey внешнего ключа (AKEY) ссылается на B (Bkey) или C (CKEY) отчет Ошибка: SQL Error: ORA- 01735: недопустимый параметр ALTER TABLE 01735. 00000 - «недопустимый параметр ALTER TABLE» – dacracot 2010-12-02 20:56:25