繁体   English   中英

jdbc中的外键问题

[英]foreign key problem in jdbc

我有两个功能:

public void Populate_flights()

public void Populate_reservations()

航班和预订是两个表格。其中一个条目即航班号。 在预订表中。 因此,这是一个外键。

现在,我需要通过jbdc填充数据库。 所以我正在使用:在公共void Populate_reservations()函数中:

Statement s = conn.createStatement();

s.executeUpdate("DELETE FROM reservations");

公共无效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");

您可以在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对象来完成所有工作。

因此,您希望在删除时级联外键引用。 您必须在外键约束上进行设置。 首先删除旧约束,然后使用级联指令重新创建它。 假设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;

这样,如果您单独删除航班,所有参考预订都将被删除。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM