IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Cannot add or update foreign key problème relation fils-fils


Sujet :

JDBC Java

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut Cannot add or update foreign key problème relation fils-fils
    j'ai deux tables: étudiant et photo, la relation entre elles est de type fils-fils, alors j'ai la fonction d'insertion de la photo qui retourne la clé que je reçois dans la fonction d'insertion de l'étudiant (en paramètre), la clé de l'étudiant est lu depuis un texteField, alors il refuse de l'insérer, voilà l'exception:
    "Cannot add or update a child row: a foreign key constraint fails (`brs`.`photo`, CONSTRAINT `FK_Photo_bac` FOREIGN KEY (`bac`) REFERENCES `etudiant` (`bac`))"


    méthode d'insertion photo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    public int insertPhoto() throws Exception {
    		String query = "INSERT INTO photo (image,bac)" + "VALUES (?,?)";
    		try (PreparedStatement stat = cnx.prepareStatement(query)) {
     
     
    			// code_photo AUTO INCREMENT
    			stat.setBinaryStream(1, fis);           //la photo
    			stat.setString(2, txtBAC.getText());  //la clé étraangère directement depuis le texteField
     
     
    			stat.executeUpdate();
    			stat.close();
    		}
    		String codeQuery = "SELECT MAX(code_photo) FROM photo";
    		try (PreparedStatement stat = cnx.prepareStatement(codeQuery)) {
     
     
    			ResultSet rslt = stat.executeQuery();
    			rslt.next();
    			return rslt.getInt(1);
    		}
    	}
    méthode d'insertion étudiant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public void insertEtudiant(int codeLieu, int codeNat, String codeF,
    			int codeMotif , int codePhoto) throws Exception {
     
     
    		try {
    			String etudiant = "INSERT INTO etudiant (bac,nom,prenom,genre,adresse,n_phone,mail,n_ccp,decision,bloque,"
    					+ "n_ins,annee_encours,annee_univ,annee_courante,reste,"
    					+ "an_1,an_2,an_3,an_4,an_5,an_6,an_7,an_8,an_9,an_10,"
    					+ "cycle,code_f,date_nais,code,code_nat,Observation,date_bloc,code_motif) "
    					+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
     
     
    			stat = cnx.prepareStatement(etudiant);
     
     
    			stat.setString(1, txtBAC.getText());  //clé primaire 
    			stat.setString(2, txtNom.getText());
    			stat.setString(3, txtPrenom.getText());
    			//
                            //
    			stat.setInt(31, codePhoto); //clé étrangère
    			//
                            //
    			stat.executeUpdate();
     
     
    		} finally {
    			stat.close();
    		}
    	}

    le code d'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    btnSave.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				try {
    					cnx.setAutoCommit(false);
     
     
    					//
    					int codePhoto = insertPhoto();
    					insertEtudiant(codeLieu, codeNat, codeF, codeMotif , codePhoto);
     
     
    					//
     
     
    					cnx.commit();
     
     
    				} catch (Exception e2) {
    					try {
    						cnx.rollback();
    					} catch (SQLException e1) {
    						e1.printStackTrace();
    					}
    					e2.printStackTrace();
    				} finally {
    					try {
    						cnx.setAutoCommit(true);
    					} catch (SQLException e1) {
    						e1.printStackTrace();
    					}
    				}
    			}
    		});

  2. #2
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Bonjour,

    ça ne va pas être possible de cette manière.

    Ce n'est pas possible d'insérer une photo contenant une clé étrangère, si cette clé étrangère n'existe pas encore dans la table Etudiant.

    De plus je ne comprends pas pourquoi il faut ajouter la colonne code_photo dans la table étudiant, vu qu'il est possible de retrouver ce code_photo via une jointure.

    Ou alors si c'est absolument nécessaire, il faut que cette colonne puisse être "nullable".

    • Ajouter l'etudiant
    • Ajouter la photo
    • Mettre à jour l'étudiant avec le code photo


    D'après ce que je vois là, cela veut dire que l'étudiant ne peut avoir qu'une seule photo, vu que le code photo est lié à l'étudiant.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    C'est bon j'ai intégré la photo dans la table étudiant, merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 27/08/2015, 17h46
  2. Cannot add or update a child row: a foreign key constraint fails
    Par dubitoph dans le forum Administration
    Réponses: 4
    Dernier message: 25/01/2012, 08h29
  3. Réponses: 3
    Dernier message: 28/11/2011, 17h26
  4. Réponses: 3
    Dernier message: 13/09/2011, 11h02
  5. Réponses: 0
    Dernier message: 12/12/2007, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo