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