当前,我有two configuration tables
存储两种不同的配置,但是,两者都有一个ID
列。我有一张叫Deactivation
的桌子。我要停用的任何配置都可以将该配置表的ID
添加到该表中。
数据库的结构如下。
我的问题是我可以创建两个引用的FK约束
- ID (FK) to T1_ID (PK)
- ID (FK) to T2_ID (PK)
(一个孩子可以有多个父母)
因此,不应允许deactivation
表插入不在id
或T1
中的任何T2
。但是,如果在该表的任何一个中找到ID
,则应该执行插入操作。
谢谢
答案 0 :(得分:0)
我认为您已经从评论中获得了答案,但在此直接声明:
关系数据库外键/主键机制并非旨在维护和加强表之间的这种关系。您必须对Deactivations使用触发器进行一些自定义操作,以检查要插入到Deactivations中的值在T1或T2中是否存在,并允许插入(如果没有)或拒绝插入。
您还必须考虑在T1和T2中进行编码,以处理更新/删除(级联它们?)和冲突(如果T1 id = 1
和T2 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不支持检查约束,因此您需要一个触发器来确保一个(但不是两个)正好不为空。