2010-11-08 2 views
1

JDBC У меня есть две функции:внешней ключевой проблемой в

public void Populate_flights() 

public void Populate_reservations() 

Авиаперелет и оговорки два tables.One въездной полета не то есть. находится в таблице бронирования. Так что это внешний ключ.

Теперь мне нужно заполнить базу данных через jbdc. Поэтому я использую: В общественных недействительных Populate_reservations() функция:

Statement s = conn.createStatement(); 

s.executeUpdate("DELETE FROM reservations"); 

общественного недействительный Populate_flights() -:

Statement s = conn.createStatement(); 

s.executeUpdate("DELETE FROM flights"); 

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

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

Statement s = conn.createStatement(); 

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

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

ответ

3

Вы можете временно отключить внешние ключи проверки в 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.

+0

Я должен сделать в java ... используя jdbc – 2010-11-08 00:42:58

+0

принимает ли он слово «SET». Я думаю, это даст мне ошибку ... позвольте мне попробовать – 2010-11-08 00:53:31

+0

PLZ проверить отредактированную часть? Это должно быть так? – 2010-11-08 01:01:56

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; 

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

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

Просьба пояснить ОП (он косвенно просит его), почему этот ответ должен решить его проблему. – Mouser

+0

Я не знаю английского языка так, чтобы объяснить, почему он работает, но он работает. –

Смежные вопросы