0

我希望我的关系表“In”有一个引用两个表的外键 SSN,但 SSN 仅在这两个表之一中。当我这样做时:

ALTER TABLE "In"
ADD CONSTRAINT in_C1 FOREIGN KEY (SSN) REFERENCES patient(SSN),
ADD CONSTRAINT in_C2 FOREIGN KEY (SSN) REFERENCES patientWithDoD(SSN)

那么 SSN 必须在表患者和患者WithDoD 中。SSN 应该在两个表之一中,但不能同时在两个表中。我怎样才能做到这一点?

4

2 回答 2

1

当列具有非空值时,所有相关的外键约束都会被检查和验证。如果检查失败,则无法插入或更新该行。

如果您有两个 FK,并且您只想强制执行其中一个,那么您需要:

  • 创建两个单独的可空列,每个 FK 一个,以及
  • 添加一个CHECK约束以强制执行一个且只有一个不为空。

例如:

create table "In" (
  id int primary key not null,
  ssn int, -- nullable
  ssn_dod int, -- nullable
  constraint fk1 foreign key (ssn) references patient (ssn),
  constraint fk2 foreign key (ssn_dod) references patientwithdod (ssn),
  constraint chk1 check (ssn is null and ssn_dod is not null or
                         ssn is not null and ssn_dod is null)
);

不幸的是,MySQL 最近才开始强制执行CHECK约束(如果我没记错的话,MySQL 8.0.3)。如果您使用的是旧版本的 MySQL,那么您就不走运了:MySQL 将允许您编写约束并保存它,但不会强制执行它。

于 2019-05-16T17:23:34.927 回答
0

我了解您在 patientWithDoD 表上没有 SSN 属性。要引用外键,您必须将此属性添加到此表中。

您建议您,仅将必要的属性添加到患者表。例如:ssn、姓名、姓氏等。

然后不要将姓名、姓氏和其他患者属性添加到 patientWithDod 表中。您只能使用 ssn 来参考剩余的患者数据。所以添加 ssn 引用 Patient.ssn 的外键

这种结构会更好,您不必参考 patienWithDod 表。

于 2019-05-16T17:26:01.600 回答