Kei*_*ies 3 oracle foreign-key constraint
如果重要的话,这在 Oracle 中实现。
我了解如何使用复合主键为表构建外键。是否可以让外键引用具有复合主键的表,其中一个键值具有静态值?
想象一下,我想要一个状态代码表。我可以很容易地为每个目的创建一个状态代码表(即一个用于 ThingStatus,一个用于 OtherThingStatus,等等)。微不足道,但会导致很多小桌子。我也可以有一个包含所有状态代码的表,每个记录还标识状态代码适用于什么(如下所示)。
create table StatusCode (
StatusTable varchar2(20) not null,
StatusValue varchar2(20) not null
);
alter table StatusCode add constraint pkStatusCode primary key (StatusTable, StatusValue);
create table Thing (
ThingId integer not null, -- primary key
TableName varchar2(20) default 'Thing',
ThingStatus varchar2(20) not null
);
alter table Thing add constraint fkThingStatus
foreign key (TableName, ThingStatus)
references StatusCode(StatusTable, StatusValue);
Run Code Online (Sandbox Code Playgroud)
非常简单,易于实现,但有一个字段(存在于每条记录中)只是为了满足外键定义而存在,这很烦人。
有没有办法做类似的事情
create table NewThing (
NewThingId integer not null, -- primary key
NewThingStatus varchar2(20) not null
);
alter table add constraint fkNewThingStatus
foreign key ('NewThing', NewThingStatus)
references StatusCode(StatusTable, StatusValue);
Run Code Online (Sandbox Code Playgroud)
我也可以将 StatusCode 视为查找表,而不显式实现外键引用,但我宁愿看到它显式实现。
从版本 11g 开始,您可以使用虚拟计算列:
create table StatusCode (
StatusTable varchar2(20) not null,
StatusValue varchar2(20) not null,
primary key (statustable, statusvalue)
) ;
create table Thing (
ThingId integer not null primary key,
TableName varchar2(20) generated always as ('Thing') virtual,
ThingStatus varchar2(20) not null,
foreign key
(TableName, ThingStatus)
references StatusCode
(StatusTable, StatusValue)
) ;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1747 次 |
最近记录: |