2017-08-17 83 views
0

自動更新對上下文敏感的關係是否有可能複製通過自動更新對上下文敏感的關係中的具體項目?MySQL的重複條目與PHP

給定一個表 '表1',如:

enter image description here

我的目標是複製所有條目與的categoryId 42,如果在更新的parentId neccessary:

enter image description here

ID是一個自動遞增的列和parentId用於標識條目之間的關係。

目前我將他們一個接一個,選擇舊數據和管理邏輯在PHP的parentId的。

//Thats simplified what I do ($conn is a Zend_Db_Adapter_Abstract) 
$rows = $conn->fetchAll("SELECT * FROM table1 WHERE categoryId = 42 ORDER BY parentId ASC"); 
$newIds = []; 
foreach($rows as $row){ 
    if(array_key_exists($row['parentId'],$newIds)) 
     $row['parentId'] = $newIds[$row['parentId']]; 
    else 
     $row['parentId'] = null; 

    $conn->query("INSERT INTO table1 (parentId,info,categoryId) VALUES (?,?,?)",[$row['parentId'],$row['info'],$row['categoryId']]); 

    $newId = $conn->lastInsertId('table1'); 

    $newIds[$row['id']] = $newId; 
} 

我堅持這一點,因爲我需要新元素的lastInsertedId設置新的parentId爲下一個。 但我遇到這很慢(相對於包含邏輯的單個查詢)。

是否有可能給查詢某種incremental元素敏感的邏輯嗎?或者你有什麼建議來解決這個問題嗎?

任何幫助表示讚賞! :)

+1

創建表在這裏,不使用外部圖像。 – tilz0R

+1

沒有弄清楚如何使用表格。在高級幫助中,它表示: 表僅在文檔頁面中可用。 –

回答

0

您沒有顯示任何代碼。我想你使用mysqli_insert_id()來獲取最後插入的ID。也許你可以用MAX(ID)+1做一些事情。

喜歡的東西:

INSERT INTO table1 
    SELECT MAX(ID)+1, 
    info, 
    categoryId  
FROM 
    table1 
WHERE .............. -- the conditions to retreive the parent 
+0

感謝您的幫助RWC。 我添加了代碼。我沒有自動增量部分的問題,因爲MySql自己處理它。 任何想法,如果它可能只使用MySQL來做PHP現在做的事情? –

+0

我想你誤會了。自動增量由MySql處理。這不是我所建議的。再看一遍。 – RWC

+0

好吧,我現在得到了你。如果能保證所有數據的順序正確(父母總是在他們的孩子面前),我可以使用你的嘗試。使用示例數據時,複製id爲4的元素時會出現問題。因爲具有MaxID的元素不會是父級,而是與id 4本身的元素副本位於同一分層的元素。 經過大量進一步的研究,我決定在PHP中留下邏輯。但做了一些結構更改,以更好的方式準備數據並減少查詢計數。 但是,無論如何感謝您的幫助! :) –