2017-04-02 3 views
0

Je tente de "dupliquer" plusieurs lignes dans ma table A. Cette table (A) a seulement deux champs qui sont des clés étrangères. Une référence à la table B et l'autre à la table C.Mysql: Insertion multiple avec Select, la clé étrangère échoue

Maintenant, je voudrais prendre plusieurs lignes de A et les réinsérer (dupliquer) dans A. Faire que je change l'une des clés étrangères (FK1).

INSERT INTO `A` (`FK1`, `FK2`) VALUES (".$newFK.", 1); 

Ce code fonctionne sans aucun problème. Mais j'ai besoin de dupliquer plus qu'une seule rangée. Bien sûr, je peux faire une instruction SELECT et utiliser fetch_array pour insérer chaque ligne une par une, mais je voudrais la résoudre plus élégante. Comme ceci:

INSERT INTO A (`FK1`, `FK2`) SELECT ".$newFK.", `FK2` FROM `A` WHERE `FK1` = '".$tobeduplicatedFK."'; 

En plus j'ai essayé

INSERT INTO `A` SET `FK1` = ".$newFK.", `FK2` = (SELECT `FK2` FROM `A` WHERE `FK1` = '".$tobeduplicatedFK."'); 

Malheureusement aucune de ces travaux. Mais je reçois le "Impossible d'ajouter ou mettre à jour une ligne enfant: une contrainte de clé étrangère échoue" - Erreur liée à FK1. Puisque la version inélégante fonctionne, le nouveau FK1 ($ newFK) existe. J'ai aussi vérifié le vieux FK1 ($ tobeduplicatedFK) et il existe aussi. Je pensais que peut-être quelque chose bousillais parce que l'instruction select est sur la même table et en utilisant le FK qui doit être changé dans WHERE-Clause. J'ai essayé d'exécuter SELECT-Statement en sélectionnant A comme Asource mais il échoue également.

Avez-vous une idée de la raison de l'échec?

+0

Exécutez la requête à nouveau, puis quand il erreurs, exécutez SHOW STATUS MOTEUR InnoDB; '. Faites défiler la sortie du résultat et trouvez la section intitulée «LATEST FOREIGN KEY ERROR». Cela vous indiquera une valeur spécifique que vous avez essayé d'insérer qui n'existait pas dans la table parente. –

+0

Si vous modifiez ce que vous mettez dans ce qui est, comment «dupliquez-vous»? (Et mettre des choses entre guillemets ne nous dit pas par magie ce que vous n'avez pas fait l'effort d'expliquer.) PS Veuillez lire et agir sur [mcve]. * Donnez tout votre code, entrée, sortie attendue et sortie, y compris les erreurs, etc * – philipxy

+0

Pourquoi les guillemets simples? – philipxy

Répondre

0

Essayez une sous-requête:

"INSERT INTO A 
(
    FK1, 
    FK2 
) 
SELECT 
    FK1, 
    FK2 
FROM  
    (SELECT 
     {$newFK} AS FK1, 
     FK2 
    FROM 
     A 
    WHERE 
     FK1 = {$tobeduplicatedFK}) x0;" 
+0

Merci pour le conseil, mais cela n'a pas fonctionné non plus. Encore recevoir la même erreur. –

+0

Peu importe essayé les deux versions. À la fin, ils déclarent la même chose. Donc, il échoue toujours. –

+0

Peut-être que vous avez une erreur dans vos foreign_keys. Pouvez-vous montrer comment vous avez défini les deux clés? –