SQL JDBC:未找到父键,但父值已插入数据库

Posted

技术标签:

【中文标题】SQL JDBC:未找到父键,但父值已插入数据库【英文标题】:SQL JDBC: parent key not found BUT the parent values have already been inserted into the database 【发布时间】:2016-04-02 20:44:05 【问题描述】:

我在将模拟数据插入数据库时​​遇到问题 我试图将值插入的表称为“已购买” 其中有一些外键值,例如patient_id、pharmacy_id、drug_id。

其他 3 个表 'patient', 'pharmacy', 'drug' 已成功添加到数据库中。

Patient 表有一个外键,即医生 ID。 “医生”表也已添加到数据库中。

因为我知道'purchased'表中的外键patient_id依赖于另一个外键doctod_id,所以我做了这样的事情

外键 (patient_id,receipt_no) 引用 patient(patient_id,doctor_id) ON DELETE CASCADE

不确定我在这里错过了什么,为什么 sqlplus 抱怨找不到父键?只是为一个数据库类项目工作,所以我还在学习。

这是 .sql 代码文件 https://gist.github.com/mopkaloppt/de8fbf64c4d5711c90e2b389a72911ba

任何形式的帮助都将不胜感激。我现在有点吓坏了,因为我已经为此苦苦挣扎了一段时间,而且很快就会到期:(

【问题讨论】:

【参考方案1】:

FK 约束的这一部分看起来很混乱:

foreign key (patient_id, receipt_no) references patient(patient_id,doctor_id) ON DELETE CASCADE
                         ^^^^^^^^^^                                ^^^^^^^^^

您收到错误是因为您的purchased 数据中没有与doctor_id 匹配的receipt_no。这也许不足为奇,因为数据不相关。

查看patient 表中的数据后,您似乎还没有完全正确地设计数据库。该表中存在重复:如果患者患有多种疾病或看过多个医生,那么所有其他列的值都会重复。这也妨碍了您的 FK 约束:您试图将 purchased 中的一行链接到一个患者,但是对于某些患者有多个行,那么您链接到哪一行?

您似乎在患者和疾病之间存在多对多的关系(一个患者可以患有多种疾病,多个患者可以患有一种疾病),并且在患者和医生之间(一个患者可以被多个医生看到,一个医生可以看多个病人)。因此,我建议为患者与疾病之间以及患者与医生之间的关系引入新表格。例如,这是您可以用于患者和医生之间关系的表格。为患者和医生的每种组合在此表中插入一行:

create table patient_doctor (
  patient_id char(4) not null,
  doctor_id char (4) not null,
  primary key (patient_id, doctor_id),
  foreign key (patient_id) references patient(patient_id) on delete cascade,
  foreign key (doctor_id) references doctor(doctor_id) on delete cascade);

这样的链接表是在关系数据库中表示多对多连接的标准方式。

你还没有疾病表,所以我让你为它们创建一个表,一个类似于患者和医生的链接表(可能是patient_illness),以及两个表中的数据.

完成此操作后,从patient 中删除doctor_idillness 列,删除重复行并使patient PK 仅依赖于patient。从purchasedpatient 的FK 约束只能引用patient_id

希望在完成所有这些之后,您应该会看到违反 FK 约束的错误消失了。

【讨论】:

非常感谢您详细的回答卢克!它现在可以工作了:)

以上是关于SQL JDBC:未找到父键,但父值已插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

SQL ORA-02291: 违反完整性约束 - 未找到父键

创建表 JDBC-MS-ACCESS

违反 - 未找到父键错误

sql jdbc getgeneratedkeys 返回列“id”未找到,列类型未知

ORA-02298 未找到父键?

ORA-02291: 违反完整性约束 (PRUEBA4.AUTO_MARCA_FK) - 未找到父键