我有两个功能:
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");
答案 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();