проблема внешнего ключа в jdbc - PullRequest
1 голос
/ 08 ноября 2010

У меня есть две функции:

public void Populate_flights()

public void Populate_reservations()

Рейс и бронирование - две таблицы. Одна из записей, т. Е. Номер рейса. находится в таблице бронирования. Так что это внешний ключ.

Теперь мне нужно заполнить базу данных через 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");

Таким образом, перед заполнением базы данных все мои предыдущие записи удаляются, и лишних данных нет. Так как в таблице бронирования есть внешний ключ, я не могу сначала удалить записи из рейса. Я должен удалить записи из бронирования в первую очередь. Но функция резервирования вызывается после функции полета. Как сделать так, чтобы она удаляла все записи?

Так и должно быть:

Statement s = conn.createStatement();

  s.execute("SET FOREIGN_KEY_CHECKS=0");

     s.executeUpdate("DELETE FROM flights");
 s.execute("SET FOREIGN_KEY_CHECKS=1");

Ответы [ 3 ]

4 голосов
/ 08 ноября 2010

Итак, вы хотите каскад ссылок на внешние ключи при удалении.Вы должны установить его на ограничение внешнего ключа.Сначала удалите старое ограничение, а затем воссоздайте его с помощью каскадной инструкции.Предполагая, что имя 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;

Таким образом, все ссылочные бронирования будут удалены, если вы удалите только рейс.

4 голосов
/ 08 ноября 2010

Вы можете временно отключить проверки внешнего ключа в 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 голос
/ 13 января 2015
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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...