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_id
和illness
列,删除重复行并使patient
PK 仅依赖于patient
。从purchased
到patient
的FK 约束只能引用patient_id
。
希望在完成所有这些之后,您应该会看到违反 FK 约束的错误消失了。
【讨论】:
非常感谢您详细的回答卢克!它现在可以工作了:)以上是关于SQL JDBC:未找到父键,但父值已插入数据库的主要内容,如果未能解决你的问题,请参考以下文章
SQL ORA-02291: 违反完整性约束 - 未找到父键