[英]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.