Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有两个引用的主键_Mysql_Sql_Postgresql - Fatal编程技术网

Mysql 具有两个引用的主键

Mysql 具有两个引用的主键,mysql,sql,postgresql,Mysql,Sql,Postgresql,我希望中的关系表有一个外键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必须位于表patient和patientWithDoD中。SSN应位于两个表中的一个

我希望中的关系表有一个外键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必须位于表patient和patientWithDoD中。SSN应位于两个表中的一个表中,但不能同时位于两个表中。如何执行此操作?

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

如果您有两个FK,并且只希望强制执行其中一个,则需要:

创建两个单独的可为空列,每个FK一个,然后 添加检查约束以强制执行一个,并且只有一个约束不为null。 例如:

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最近才开始强制执行检查约束MySQL 8.0.3。如果您使用的是较旧版本的MySQL,那么您就不走运了:MySQL将允许您编写约束并保存它,但不会强制执行它。

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

建议您只向患者表添加必要的属性。例如:ssn、姓名、姓氏等

然后不要将姓名和其他患者属性添加到patientWithDod表中。您只能使用ssn引用剩余的患者数据。因此,添加ssn引用Patient.ssn的外键


这种结构会更好,并且您不必引用DoD表。

外键值必须出现在所有引用的表中;这是它们存在的核心原因。NULL可用于使引用可选,但必须存在任何实际值。。。一般来说,一个字段引用多个表不是一个好主意。MySQL的哪个版本?如果这是MySQL,为什么我会在你的问题上看到postgres标签???请删除。我想到了一个后续问题:DOD患者有什么不同,需要单独的表格?您是否考虑过只使用一个患者表,以及一个参考患者表的单独的PatientDoInfo表?