jdbc中的外键问题
Posted
技术标签:
【中文标题】jdbc中的外键问题【英文标题】:foreign key problem in jdbc 【发布时间】:2011-05-06 10:47:46 【问题描述】:我有两个功能:
public void Populate_flights()
public void Populate_reservations()
航班和预订是两张表。其中一个条目,即航班号。在预订表中。所以它是一个外键。
现在,我需要通过 jbdc 填充数据库。所以我正在使用:在 公共无效 Populate_reservations() 函数:
Statement s = conn.createStatement();
s.executeUpdate("DELETE FROM reservations");
public void Populate_flights() -:
Statement s = conn.createStatement();
s.executeUpdate("DELETE FROM flights");
所以这样,在填充数据库之前,我之前的所有条目都被删除了,并且没有多余的数据。由于预订表中有一个外键,我不能先从航班中删除条目。我必须先从预订中删除条目。但是预订功能是在航班功能之后调用的。所以我该如何制作它才能删除所有条目。
所以应该是这样的:
Statement s = conn.createStatement();
s.execute("SET FOREIGN_KEY_CHECKS=0");
s.executeUpdate("DELETE FROM flights");
s.execute("SET FOREIGN_KEY_CHECKS=1");
【问题讨论】:
【参考方案1】:您可以在 mysql 中临时禁用外键检查,以执行如果启用这些检查会失败的操作:
// Disable foreign keys check
Statement stmt = conn.createStatement();
stmt.execute("SET FOREIGN_KEY_CHECKS=0");
stmt.close();
// Do your stuff
// Enable foreign keys check
Statement stmt = conn.createStatement();
stmt.execute("SET FOREIGN_KEY_CHECKS=1");
stmt.close();
请注意,这是针对每个连接的设置,因此您必须使用相同的 conn
对象来完成所有工作。
【讨论】:
我必须在 java 中做...使用 jdbc 它是否接受单词“SET”。我想,它会给我错误...让我试试 它应该可以工作,但只删除您最终得到的预订涉及不存在的航班的航班。我不太确定您要做什么,但也请阅读@BalusC 关于级联删除的答案。 @shilps 是否有充分的理由按照您描述的顺序调用函数?似乎先删除预订(如果可以的话)也可以解决您的问题。【参考方案2】:所以你想cascade 删除外键引用。您必须在外键约束上设置它。首先删除旧约束,然后使用级联指令重新创建它。假设 FK 名称是 fk_flight
,下面是一个示例:
ALTER TABLE reservations
DROP CONSTRAINT fk_flight;
ALTER TABLE reservations
ADD CONSTRAINT fk_flight
FOREIGN KEY (flight_id)
REFERENCES flight(id)
ON DELETE CASCADE;
这样,如果您单独删除航班,所有引用的预订都将被删除。
【讨论】:
【参考方案3】:Statement s = conn.createStatement();;
s.addBatch("SET FOREIGN_KEY_CHECKS = 0");
s.addBatch("DELETE FROM reservations");
s.addBatch("DELETE FROM flights");
s.addBatch("SET FOREIGN_KEY_CHECKS = 1");
s.executeBatch();
【讨论】:
请向 OP(他间接要求)解释为什么这个答案应该解决他的问题。 我不懂英语,所以无法解释为什么它有效,但它有效。以上是关于jdbc中的外键问题的主要内容,如果未能解决你的问题,请参考以下文章