2

假设我有三个表(Patients Doctors 和 Medicines)。Patients 表有一个 FK 约束,它引用了 Doctors 表中的一列,类似地 Medicines 表有一个 FK 约束,它引用了 Patients 表中的一列。现在,当我尝试从患者中删除时,使用

//Delete From Patient Table
    javax.persistence.Query query = manager.createQuery("DELETE  From PatientEnroll e WHERE e.no =:arg1");
    int val = Integer.parseInt(no);
    query.setParameter("arg1", val);
    query.executeUpdate();

我收到以下错误:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`acme`.`medicines`, CONSTRAINT `PatientNo` FOREIGN KEY (`PatientNo`) REFERENCES `Patients` (`PatientNo`) ON DELETE NO ACTION ON UPDATE NO ACTION)

如何从患者表中删除某些内容?

4

1 回答 1

3

首先删除引用患者的药物:

delete from Medicine m 
where m.patient.id in (select p.id from PatientEnroll p where p.no = :arg1)

或将它们与患者解除关联以删除:

update Medicine m set patient = null 
where m.patient.id in (select p.id from PatientEnroll p where p.no = :arg1)

否则,您显然会破坏外键约束:引用不存在患者的药物将保留在数据库中。这正是外键约束的用处:避免这种不一致。

请注意,除非有数百名具有给定数量的患者,否则使用 JPA 执行此操作的通常方法是:

Patient p = getPatientByNumber(args1);
em.remove(p);

如果您在关联上有一个 REMOVE 类型的级联,则所有药物也将被删除。如果没有,您将不得不这样做:

Patient p = getPatientByNumber(args1);
for (Medicine m : p.getMedicines()) {
    em.remove(m);
}
em.remove(p);

或者

Patient p = getPatientByNumber(args1);
for (Medicine m : p.getMedicines()) {
    m.setPatient(null);
}
em.remove(p);
于 2012-07-27T14:59:38.200 回答