jdbc中的外键问题

时间:2010-11-08 00:25:59

标签: java mysql jdbc

我有两个功能:

public void Populate_flights()

public void Populate_reservations()

航班和预订是两个表。其中一个条目即航班号。在预订表中。所以这是一把外键。

现在,我需要通过jbdc填充数据库。所以我正在使用:In public void 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");

3 个答案:

答案 0 :(得分:4)

您可以临时禁用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对象执行所有操作。

答案 1 :(得分:3)

因此,您希望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;

这样,如果您单独删除航班,则会删除所有引用的预订。

答案 2 :(得分:1)

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();