2017-04-02 31 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有錯誤。你能證明,你是如何定義這兩個鍵的? –