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

 MySQL Discussion :

Cannot add or update a child row quand je fais un update ?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut Cannot add or update a child row quand je fais un update ?
    Bonjour,

    J'ai deux tables Comptes et Operations.
    Num_compte varchar(10) est une clé primaire dans la table Comptes.

    J'ai défini une contrainte de clé étrangère ( On delete cascade on update cascade) sur la colonne Num_compte dans la table Operations( pour s'assurer que chaque numéro de compte objet d'une opération est sûrement déjà dans la table mère Comptes).

    Mais quand je fais un "update" dans la table Comptes pour modifier le Num_compte clé primaire ici, il me signale l'erreur:
    Cannot add or update a child row : a foreign key constraints fails ....On Delete cascade on update cascade.


    Vous avez une idée d’où ça provient ?
    Car normalement si je modifie un Num_compte dans la table mère Comptes; ça devrait modifier tous les num_compte dans la table Operations.
    mais ici ça refuse !

    Merci de vos solutions. Ça me bloque.

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par madina Voir le message
    Bonjour,

    J'ai deux tables Comptes et Operations.
    Num_compte varchar(10) est une clé primaire dans la table Comptes.
    Saluton,
    Déjà, c'est une mauvaise idée de prendre un varchar comme clé primaire, il vaut mieux prendre un integer en auto-increment, quitte à déclarer la colonne qui contient le numéro de compte en UNIQUE.
    Citation Envoyé par madina Voir le message
    J'ai défini une contrainte de clé étrangère( On delete cascade on update cascade) sur la colonne Num_compte dans la table Operations( pour s'assurer que chaque numéro de compte objet d'une operation est surement déja dans la table mére Comptes).

    mais quand je fais un "update" dans la table Comptes pour modifier le Num_compte clé primaire ici, il me signale l'erreur:
    Cannot add or update a child row : a foreign key constraints fails ....On Delete cascade on update cascade.


    Vous avez une idée d’où ça provient ?
    car normalement si je modifie un Num_compte dans la table mère Comptes; ça devrait modifier tous les num_compte dans la table Operations.
    mais ici ça refuse .
    Les clés étrangères ne sont supportées que par le moteur InnoDB de MySQL, est-ce bien le cas ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    Bonjour,

    Merci pour la réponse.

    J'utilise wamp.

    En fait dans PhpMyadmin, pour les tables,

    le type est "InnoDB", l'Interclassement est : latin1_swedish_ci

    ça veut dire que le moteur de MySQL est InnoDB ?

    Mais le fait que il me signale l'erreur prouve que il prend bien en compte les contraintes de clés étrangères.

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Le moteur peut-être différent pour chaque table, donc il faudrait nous afficher, pour chacune des deux tables, le résultat d'un SHOW CREATE TABLE, afin que l'on soit bien en phase quant à ce dont on parle.
    Par ailleurs, en compta, en termes de modélisation conception, on a plutôt habituellement une table des comptes (sorte de plan comptable ou nomenclature comptable), une table des opérations et un table des lignes d'écritures (1 débit 1 à n crédits ou 1 à n débits pour un crédit).
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 469
    Par défaut
    Bonjour,
    Merci voilà la description des tables.



    Table Comptes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE Comptes(
    Num_compte varchar( 10 ) PRIMARY KEY ,
    intitule_compte varchar( 100 ) NOT NULL ,
    nature_compte ENUM( 'Produits', 'Charges', 'Investissements' ) NOT NULL ,
    Id_chapitre varchar( 10 ) not null,
    CONSTRAINT `FKcompte_chapitre` FOREIGN KEY `FKcompte_chapitre` ( `Id_chapitre` ) REFERENCES `Chapitres` ( `Id_chapitre` ) ON DELETE CASCADE ON UPDATE CASCADE)
    Table Operations

    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
    Create table Operations
     
    ( montant_realise float,
    date_realise Date,
    taux double,
    reliquat float,
    reference varchar(100),
    fournisseur varchar(100),
    branche ENUM('AT','PT'),
    Num_compte varchar(10),
    Id_rubrique int(5) UNSIGNED,
    Code_cr  varchar(10),
    primary key(Num_compte,date_realise ,montant_realise,Code_cr),
     
    CONSTRAINT `FK_comptes_operations` FOREIGN KEY `FK_comptes_operations` ( `Num_compte` ) REFERENCES `Comptes` ( `Num_compte` ) ON DELETE CASCADE ON UPDATE CASCADE,
     
    )
    Table Chapitres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table Chapitres(Id_chapitre varchar(10) primary key,
                           designation_chapitre varchar(30) not null)
    Bon de ma part, je n'ai que la table opérations qui contient l'ensemble des montants des opérations des numéros de compte.
    En fait de ma part, y'a pas une politique de comptabilité c'est juste au niveau interne savoir les dépenses de chaque structure.

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Bizarre que les SHOW CREATE TABLE n'affiche pas TYPE=INNODB.
    Par ailleurs il faut s'assurer de tout cela :
    Les deux tables doivent être de type InnoDB, dans la table, il doit y avoir un INDEX où les clés étrangères sont listées comme première colonne, dans le même ordre, et dans la table référencée, il doit y avoir un INDEX où les colonnes référencées sont listées comme premières colonnes, dans le même ordre. Les préfixes d'index ne sont pas supportés pour les clés de contrainte.

    InnoDB ne crée pas automatiquement les index nécessaires pour les clés étrangères : vous devez les créer vous-même. Les index sont nécessaires pour accélérer les vérifications de contrainte, et éviter un scan de table.

    Les colonnes correspondantes de la contrainte dans la table et la table de référence doivent avoir le même type, pour éviter les conversions lors des comparaisons. La taille et la présente du signe pour les entiers doit être les mêmes. La taille des chaînes doivent être les mêmes. Si vous spécifiez une action SET NULL, assurez vous que vous n'avez pas déclaré les colonnes de la table fille NOT NULL.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. Réponses: 13
    Dernier message: 27/08/2015, 17h46
  2. Réponses: 3
    Dernier message: 28/11/2011, 17h26
  3. Réponses: 3
    Dernier message: 13/09/2011, 11h02
  4. Réponses: 9
    Dernier message: 24/04/2011, 17h03
  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