部分主键上的外键

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 视为查找表,而不显式实现外键引用,但我宁愿看到它显式实现。

ype*_*eᵀᴹ 5

从版本 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)