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

时间:2016-04-02 20:44:05

标签: sql database eclipse jdbc terminal

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

其他3个表'患者','药房','药物'已成功添加到数据库中。

患者表有一个外键,即doctor_id。 'doctor'表也已添加到数据库中。

因为我知道'购买'表中的外键patient_id依赖于另一个外键doctod_id,所以我做了类似的事情

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

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

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

任何形式的帮助都会非常感激..我现在吓坏了一段时间因为我已经挣扎了一段时间而且很快就要到了:(

1 个答案:

答案 0 :(得分:1)

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

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

您收到错误是因为receipt_no数据中没有purchaseddoctor_id匹配。由于数据不相关,这也许并不令人惊讶。

查看了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),以及数据两张桌子。

完成上述操作后,从doctor_id中移除illnesspatient列,删除重复的行,并使patient PK仅依赖{{1} }}。您的patientpurchased的FK约束只能引用patient

希望在完成所有这些操作后,您应该会看到FK约束违规错误消失。