jdbc中的外键问题

我有两个function:

public void Populate_flights() public void Populate_reservations() 

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

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

所以通过这种方式,在填充数据库之前,我之前的所有条目都被删除,并且没有冗余数据。因此,预订表中有一个外键,我无法先从航class中删除条目。 我必须先从预订中删除条目。 但是在飞行function之后调用预约function。如何进行预约function以便删除所有条目。

所以它应该是这样的:

 Statement s = conn.createStatement(); s.execute("SET FOREIGN_KEY_CHECKS=0"); s.executeUpdate("DELETE FROM flights"); s.execute("SET FOREIGN_KEY_CHECKS=1"); 

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

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

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

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