2010-11-08 5 views
1

J'ai deux fonctions:problème clé étrangère dans jdbc

public void Populate_flights() 

public void Populate_reservations() 

Vol et réservations sont deux tables.One du vol i.e. d'entrée pas. est dans la table de réservation. Donc c'est une clé étrangère.

Maintenant, j'ai besoin de remplir la base de données via jbdc. Donc, je me sers: Dans Populate_reservations public void() fonction:

Statement s = conn.createStatement(); 

s.executeUpdate("DELETE FROM reservations"); 

Populate_flights public void() -:

Statement s = conn.createStatement(); 

s.executeUpdate("DELETE FROM flights"); 

donc de cette manière, avant de peupler la base de données, toutes mes entrées précédentes sont supprimé, et aucune donnée redondante est là. Depuis, il y a une clé étrangère dans la table de réservation, je ne peux pas supprimer les entrées du vol d'abord. Je dois d'abord supprimer les entrées de la réservation. Mais la fonction de réservation est appelée après la fonction de vol.SO comment je le ferais pour qu'il supprime toutes les entrées.

Il devrait ressembler à ceci:

Statement s = conn.createStatement(); 

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

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

Répondre

3

Vous pouvez désactiver temporairement les contrôles clés étrangers dans MySQL pour effectuer des opérations qui ne parviendrait pas si ces contrôles ont été activés:

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

Notez que ceci est un paramètre par connexion de sorte que vous devez faire tous vos trucs en utilisant le même objet conn.

+0

Je dois faire en Java ... en utilisant jdbc –

+0

accepte-t-il le mot "SET". Je pense, il me donnera l'erreur ... laissez-moi essayer –

+0

plz vérifier la partie éditée? Il devrait être comme ça? –

3

Vous souhaitez donc cascade les références de clé étrangère lors de la suppression. Vous devez le définir sur la contrainte de clé étrangère. Abandonnez d'abord l'ancienne contrainte, puis recréez-la avec l'instruction en cascade. Si l'on suppose que le nom FK est fk_flight, voici un exemple:

ALTER TABLE reservations 
    DROP CONSTRAINT fk_flight; 

ALTER TABLE reservations 
    ADD CONSTRAINT fk_flight 
    FOREIGN KEY (flight_id) 
    REFERENCES flight(id) 
    ON DELETE CASCADE; 

De cette façon, toutes les réservations référencées seront supprimées si vous supprimez seul le vol.

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

S'il vous plaît fournir une explication à l'OP (Il le demande indirectement) pourquoi cette réponse devrait résoudre son problème. – Mouser

+0

Je ne connais pas tellement l'anglais pour expliquer pourquoi ça marche, mais ça marche. –