【问题标题】:SQL JDBC: parent key not found BUT the parent values have already been inserted into the databaseSQL JDBC:未找到父键,但父值已插入数据库
【发布时间】: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

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

【问题讨论】:

    标签: sql database eclipse jdbc terminal


    【解决方案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 约束的错误消失了。

    【讨论】:

    • 非常感谢您详细的回答卢克!它现在可以工作了:)
    猜你喜欢
    • 2016-05-31
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多