Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/07/2011, 00h44   #1
Débutant
 
Inscription : avril 2005
Messages : 464
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 464
Points : 69
Points : 69
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.
madina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 11h37   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 13h14   #3
Débutant
 
Inscription : avril 2005
Messages : 464
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 464
Points : 69
Points : 69
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.
madina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 13h46   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 14h17   #5
Débutant
 
Inscription : avril 2005
Messages : 464
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 464
Points : 69
Points : 69
Bonjour,
Merci voilà la description des tables.



Table Comptes

Code :
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 :
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 :
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.
madina est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 02h25   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Bizarre que les SHOW CREATE TABLE n'affiche pas TYPE=INNODB.
Par ailleurs il faut s'assurer de tout cela :
Citation:
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h06.


 
 
 
 
Partenaires

Hébergement Web