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中的外键问题的主要内容,如果未能解决你的问题,请参考以下文章

此表中的外键约束有啥问题?

Laravel 4迁移问题中的外键

Oracle 中的外键创建问题

连接操作中的外键

sql数据建模器中的外键问题

如何遍历 Django 字典中的外键?