针对PK表中数据范围的Oracle引用完整性

时间:2014-11-21 17:07:15

标签: constraints referential-integrity oracle12c

考虑以下设计:

LEGAL_CASE table (columns)
--------------------------------
LEGAL_CASE_ID
APPELLATE_CRT_ID
DISTRICT_CRT_ID
TRIAL_CRT_ID

所有法院都在查询表中定义

COURT table (data)
--------------------------------------------
CRT_ID     CRT_TYPE      CRT_NAME
--------------------------------------------
1          A             APPELLATE COURT 1
2          A             APPELLATE COURT 2
3          D             DISTRICT COURT 1
4          D             DISTRICT COURT 2
5          T             TRIAL COURT 1
6          T             TRIAL COURT 2

我认为,这样做的标准方法是为每种球场类型设置一个单独的查找表,但我更喜欢在不同的代码下将它们全部放在一个中,以实现紧凑和优雅。那么我想有一些形式的参照完整性约束(如果上面排除了FK),它将强制执行所有它可以进入APPELLATE_CRT_ID的是来自COURT表的CRT_ID值,但仅限CRT_TYPE =&#39 ; A' 等。普通的FK也允许Ds和Ts,但我想让它更具限制性。

有没有办法制定可以限制主键表中一系列值的FK,还是应该使用RULE或其他类型的CONSTRAINT

1 个答案:

答案 0 :(得分:1)

如果您希望查找表具有参照完整性,则需要向CRT_TYPE表添加多个legal_case列,并将这些列作为外键的一部分包含在内。像

这样的东西
CREATE TABLE legal_case (
  legal_case_id      integer primary key,
  appellate_crt_id   integer,
  appellate_crt_type varchar2(1),
  district_crt_id    integer,
  district_crt_type  varchar2(1),
  ...
  constraint fk_appelate_crt foreign key (appelate_crt_id, appellate_crt_type) references court(crt_id, crt_type),
  constraint fk_district_crt foreign key (district_crt_id, district_crt_type)  references court(crt_id, crt_type),
  ...
);

当然,这需要court表的主键(或者我不喜欢引用nno-primary键的外键的唯一约束)crt_id, crt_type而不仅仅是{{} 1}}。

否则,您将考虑编写触发器以验证此类事情(如果您希望阻止会话A修改crt_id行,而会话B具有依赖于此类的未提交更改,则会更加痛苦该行的现有状态)或可能创建一个court物化视图,其中包含一组适当的约束,这些约束组合了这两个表中的数据。