Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jdbc中的外键问题_Java_Mysql_Jdbc - Fatal编程技术网

Java jdbc中的外键问题

Java jdbc中的外键问题,java,mysql,jdbc,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 reser

我有两个职能:

public void Populate_flights()

public void Populate_reservations()
航班和预订是两个表。其中一个条目即航班号在预订表中。所以它是一个外键

现在,我需要通过jbdc填充数据库。所以我用:In public void Populate_reservations()函数:

Statement s = conn.createStatement();

s.executeUpdate("DELETE FROM reservations");
公共航班号()-:

这样,在填充数据库之前,我以前的所有条目都会被删除,并且没有冗余数据。因为预订表中有一个外键,所以我不能先从航班中删除条目。我必须先从预订中删除条目。但是预订功能是在航班功能之后调用的。那么我应该如何使它删除所有条目呢

所以它应该是这样的:

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\U 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;

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

我必须用java做……使用JDBC它是否接受“SET”这个词。我想,这会给我一个错误…让我试一下,它应该会起作用,但如果只删除那些航班,你就会得到那些不存在的航班的预订。我不太清楚您想做什么,但请同时阅读@BalusC answer about cascading deletes@shilps是否有充分的理由按照您描述的顺序调用函数?似乎先删除预订(如果你能做到的话)也能解决你的问题。请向OP解释(他间接要求)为什么这个答案能解决他的问题。我不太懂英语来解释为什么它有效,但它有效。
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();
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();