我可以创建从单一FK到多个PK

时间:2018-12-10 09:59:57

标签: mysql sql database rdbms

当前,我有two configuration tables存储两种不同的配置,但是,两者都有一个ID列。我有一张叫Deactivation的桌子。我要停用的任何配置都可以将该配置表的ID添加到该表中。

数据库的结构如下。

enter image description here

我的问题是我可以创建两个引用的FK约束

- ID (FK) to T1_ID (PK)
- ID (FK) to T2_ID (PK)

(一个孩子可以有多个父母)

因此,不应允许deactivation表插入不在idT1中的任何T2。但是,如果在该表的任何一个中找到ID,则应该执行插入操作。

谢谢

2 个答案:

答案 0 :(得分:0)

我认为您已经从评论中获得了答案,但在此直接声明:

关系数据库外键/主键机制并非旨在维护和加强表之间的这种关系。您必须对Deactivations使用触发器进行一些自定义操作,以检查要插入到Deactivations中的值在T1或T2中是否存在,并允许插入(如果没有)或拒绝插入。

您还必须考虑在T1和T2中进行编码,以处理更新/删除(级联它们?)和冲突(如果T1 id = 1T2 id = 2会怎样,但是随后您更改T2 ID也为1?如果T1中存在的ID(代表一个事物)插入到T2中(代表另一个事物),该怎么办?T2中的新事物会自动停用吗?我的电话会因为有人停止支付其合同而停止工作吗?平板电脑?)

答案 1 :(得分:0)

我认为您的关系倒退了。基本上,您希望deactivations(或其他表)具有主键。然后,可以在其他表之间共享它:

create table deactivations (
     deactivationId int auto_increment primary key,
     . . .
);

create table config1 (
     config1Id int primary key,
     . . . 
     constraint fk_config1_config1Id foreign key (config1Id) references deactivations(deactivationId)
);

create table config2 (
     config2Id int primary key,
     . . . 
     constraint fk_config2_config2Id foreign key (config2Id) references deactivations(deactivationId)
);

这不是您所需要的100%,因为两个表之间可以共享deactivationId。有很多解决方法,但是在MySQL中,这种检查需要触发器。

如果您仍然想使用解决方案,则可以使用生成的列:

create table deactivations (
    config1Id int,
    config2Id int,
    id int generated always as (coalesce(config1Id, config2Id)),
    constraint fk_deactivations_config1Id as foreign key (config1Id) references config1(config1Id),
    constraint fk_deactivations_config2Id as foreign key (config2Id) references config2(config2Id)
);

不幸的是,MySQL不支持检查约束,因此您需要一个触发器来确保一个(但不是两个)正好不为空。