【发布时间】:2017-09-06 20:33:53
【问题描述】:
我有以下表格:
create table AAA
(
AAA_ID NUMBER
);
alter table AAA
add constraint AAA_PK
primary key (AAA_ID);
create table BBB
(
BBB_ID NUMBER,
AAA_ID NUMBER
);
alter table BBB
add constraint BBB_PK
primary key (BBB_ID, AAA_ID); --IMPORTANT
alter table BBB
add constraint BBB_FK_01
foreign key (AAA_ID)
references AAA (AAA_ID);
create table CCC
(
CCC_ID NUMBER,
AAA_ID NUMBER
);
alter table CCC
add constraint CCC_PK
primary key (CCC_ID); --IMPORTANT
alter table CCC
add constraint CCC_FK_01
foreign key (AAA_ID)
references AAA (AAA_ID);
create table CCC_BBB
(
CCC_ID NUMBER,
CCC_BBB_ID NUMBER,
BBB_ID NUMBER
);
alter table CCC_BBB
add constraint CCC_BBB_PK
primary key (CCC_ID, CCC_BBB_ID);
alter table CCC_BBB
add constraint CCC_BBB_FK_01
foreign key (CCC_ID)
references CCC (CCC_ID);
我想在引用BBB 的CCC_BBB 中添加一个外键约束。 BBB_ID 直接存在于CCC_BBB 中,但没有AAA_ID。但是,AAA_ID 存在于 CCC 中,由 CCC_BBB_FK_01 引用。是否可以用 SQL 来表达这个约束?
我更喜欢符合标准的解决方案,但也欢迎使用特定于 Oracle 的解决方案。
编辑。我被要求澄清现实世界的问题是什么,所以这是我的尝试(我不想在这里讨论真正的问题领域):
AAA 是一个过程。 BBB 是一个过程步骤。多个进程的步骤名称相似,但含义不同,因此该表具有复合键。 CCC 是一个流程实例。它们的 ID 是唯一的,因此该表没有复合 PK。 CCC_BBB 是在特定实例中采取的步骤列表。
我需要确保流程实例的步骤列表仅包含该流程允许的那些步骤。
【问题讨论】:
-
我不相信你所描述的是可能的。
-
看来你的理论例子没有完全意义。
-
创建所有表后触发所有更改命令的一种方法
-
@AlexPoole 我已经修复了这个例子。我不能在这里展示问题域的真实对象,我会看看我是否能想出类似的东西。
-
这就是为什么老手倾向于实现代理(技术,合成)主键并强制复合键作为唯一约束。代理主键避免将复合列级联到依赖表。
标签: sql oracle foreign-keys data-modeling