2017-04-02 33 views
0

我试着“复制”我的表A中的几行。这个表(A)只有两个字段是外键。一个引用表B,另一个引用表C.Mysql:多个插入选择,外键失败

现在我想从A中取几行并将它们重新插入(重复)到A中。这样做是为了更改其中一个外键( FK1)。

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

此代码没有任何问题。但我需要复制不止一行。当然,我可以做一个SELECT语句,并使用fetch_array逐一插入每一行,但我想解决它更优雅。就像这样:

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

除了我曾尝试

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

遗憾的是没有这些工作。但我确实收到“无法添加或更新子行:外键约束失败” - 与FK1相关的错误。由于不雅的版本正在运行,新的FK1($ newFK)存在。我也检查了旧的FK1($ tobeduplicatedFK),它也存在。

我想可能会因为select语句在同一个表上,并使用必须在WHERE-Clause中更改的FK而混淆。我曾尝试从As源执行SELECT语句选择,但它也失败了。

任何想法为什么它失败?

+0

运行查询一次,然后当它的错误,运行'SHOW ENGINE INNODB STATUS;'。滚动浏览结果输出并找到标题为'LATEST FOREIGN KEY ERROR'的部分。这会告诉你一个你尝试插入的父表中不存在的特定值。 –

+0

如果你正在改变你正在投入的东西,你是如何“复制”的? (用引号括起来并不神奇地告诉我们你没有做出什么努力来解释。)PS请阅读[mcve]并采取行动。 *给你所有的代码,输入,期望的输出和输出,包括错误等。* – philipxy

+0

为什么单引号? – philipxy

回答

0

尝试一个子查询:

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

感谢您的提示,但它也没有工作。仍然收到相同的错误。 –

+0

尝试两个版本都没关系。最后,他们说的是一样的。所以它仍然失败。 –

+0

也许你的foreign_keys有错误。你能证明,你是如何定义这两个键的? –