Bonjour,
Un UPDATE refuse de s'exécuter en renvoyant le message :
Bon, il peut sembler étrange qu'il parle "d'ajouter" alors que je fais un UPDATE mais c'est la traduction du message en français qui est incomplète car le message 1216 en anglais est :#1216 - Impossible d'ajouter un enregistrement fils : une constrainte externe l'emp�che
Ce que je cherche à faire dans la requête ci-dessous, c'est d'importer dans ma table 'cartodico.imports' l'index de 'cartodico.fourdon' correspondant au 'fournisseur' de la table 'dictionnaire.zdpimport_plus'.Cannot add or update a child row: a foreign key constraint fails
Voici la méchante bête :
La première table temporaire me donne les imports avec le nom de la zone de dépôt où ils figurent et la valeur actuelle de la clé étrangère ImpFourDon.
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 CREATE TEMPORARY TABLE cartodico.imports_bis SELECT i.ImpIndex, z.ZDNom, i.ImpNomTable, i.ImpFourDon FROM cartodico.imports i INNER JOIN cartodico.zonesdepot z ON z.ZDIndex = i.ImpZoneDepot WHERE i.ImpFourDon = 6 ORDER BY z.ZDNom, i.ImpNomTable; CREATE TEMPORARY TABLE dictionnaire.impfour SELECT zonom, nomtable, fournisseur FROM dictionnaire.zdpimport_plus WHERE fournisseur <> '' AND fournisseur <> 'inconnu' ORDER BY zonom, nomtable; CREATE TEMPORARY TABLE cartodico.impfrn SELECT i1.ImpIndex, fd.FDIndex FROM cartodico.imports_bis i1 INNER JOIN (dictionnaire.impfour i2 INNER JOIN cartodico.fourdon fd ON fd.FDNom = i2.fournisseur ) ON i1.ZDNom = i2.zonom AND i1.ImpNomTable = i2.nomtable ORDER BY i1.ImpIndex; UPDATE cartodico.imports i SET ImpFourDon = ( SELECT i3.FDIndex FROM cartodico.impfrn i3 WHERE i.ImpIndex = i3.ImpIndex)
La deuxième table temporaire me donne les imports de la vielle table avec le nom de leur fournisseur.
La troisième table temporaire fait la correspondance entre les deux premières et retourne 340 lignes dont tous les ImpIndex proviennent évidemment de 'cartodico.imports' et tous les 'FDIndex' proviennent de 'cartodico.fourdon'.
Il n'y a donc pas de fournisseurs inconnus de fourdon et la clé étrangère devrait toujours être respectée.
Il y a d'autres clés étrangères dans 'cartodico.imports' mais elles ne sont pas modifiées par l'UPDATE et elles sont actuellement toutes satisfaites (sinon les lignes défectueuses n'existeraient pas).
Donc je sèche, je ne trouve pas pourquoi il retourne ce message d'erreur.
Un spécialiste a une idée ?
Question subsidiaire : y-a t-il un moyen de savoir sur quelle ligne la requête trébuche ? Ça aiderait à comprendre.
Partager