外键可以设置为条件。您没有显示每个表的布局,因此这是显示您的关系的典型设计:
create table TransactionalStores(
ID int not null auto_increment,
StoreType char not null,
..., -- other data
constraint CK_TransStoreType check( StoreType in( 'B', 'K', 'O' )),
constraint PK_TransactionalStores primary key( ID ),
constraint UQ_TransStoreTypes unique( ID, StoreType ) -- for FK references
);
create table Kiosks(
ID int not null,
StoreType char not null,
..., -- other Kiosk data
constraint CK_KioskStoreType check( StoreType = 'K' ), -- kiosks only
constraint PK_Kiosks primary key( ID, StoreType ),
constraint FK_Kiosks_TransStores foreign key( ID, StoreType )
references TransactionalStores( ID, StoreType )
);
Onlines和BrickMorters具有相同的基本结构,但StoreType视情况限制为仅'O'或'B'。
现在,您希望从另一个表引用一个TransactionalStores(并通过它引用到各个store表),但仅限于Kiosks和BrickMorter。唯一的区别是约束:
create table Employees(
ID int not null,
StoreID int,
StoreType char,
..., -- other Employee data
constraint PK_Employees primary key( ID ),
constraint CK_Employees_StoreType check( coalesce( StoreType, 'X' ) <> 'O' )), -- Online not allowed
constraint FK_Employees_TransStores foreign key( StoreID, StoreType )
references TransactionalStores( ID, StoreType )
);
在此表中,FK参考将StoreType强制为“ K”,“ O”或“ B”,但字段约束进一步将其限制为“ K”或“ B”。
为了说明起见,我使用了检查约束来限制TransactionStores表中的商店类型。在现实生活中,将StoreType用作该表的FK的StoreTypes查找表可能是更好的设计选择。