Bonjour,
Un UPDATE refuse de s'exécuter en renvoyant le message :
#1216 - Impossible d'ajouter un enregistrement fils : une constrainte externe l'emp�che
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 :
Cannot add or update a child row: a foreign key constraint fails
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'.

Voici la méchante bête :
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 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.

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.