2014-07-22 39 views
1

我有一個一對多的表(實際上應用程序實際上會使用多對多,但這與我的問題無關)。假設兩列具有以下值:用新值更新聯結表

c1 c2 
2 3 
4 1 
4 3 
4 4 
6 4 

對於4給定的C1值,我想在陣列與C2的值來更新表[1,2,4,6]。因此,我的表現在如下(注意記錄4,2和4,6被添加,記錄4,3不再存在,記錄4,1和4,4保持不變):

c1 c2 
2 3 
4 1 
4 2 
4 4 
4 6 
6 4 

完成此操作的最佳方法是什麼?我「可以」首先查詢數據庫以選擇c1 = 4的現有值,然後使用array_intersect()來識別添加和刪除的記錄,並根據需要插入/刪除,但這看起來過多。

+0

也許我錯過了一些東西,但爲什麼不刪除行,其中c1 = 4,並根據您的數組插入記錄?而不是試圖找出哪些行存在,丟失或存在不同的值。 – SQLChao

+0

@趙超。是的,那是另一種選擇。是否推薦?什麼是對索引的影響? – user1032531

+0

確實可能導致碎片。我想這取決於這種類型的操作將會發生的頻率,索引的大小。對不起,我一開始就在考慮一次性操作。 – SQLChao

回答

0

我知道這是舊的,但它花了我一段時間才找到答案,這個問題在谷歌上排名很高。

我發現下面的代碼並修改它:

INSERT IGNORE INTO my_table VALUES (1,1), (1,2), (1,3); 

DELETE FROM my_table WHERE c1 NOT IN (1,2,3) AND my_table = 1; 

產地的源代碼:http://borzacchiello.it/how-to-update-a-junction-table/



我的代碼,我修改了與PHP變量使用& PDO循環:

$a_id = $my_main_id //this would be c1 in the above question 

    //Set Variable From Post 
    $var_1 = isset($_POST['var_1']) ? $_POST['var_1'] : ''; 
    $var_2 = isset($_POST['var_2']) ? $_POST['var_2'] : ''; 
    //etc, etc, etc 

    //put variables into array 
    $data = array('var_1'=>$var_1, 'var_2'=>$var_2, 'var_3'=>$var_3, 'var_4'=>$var_4, 'tarp_5'=>$tarp_5); 

         //get count of variable that contain data and not empty 
         $data_array_count = 0; 
         foreach ($data as $column => $value) {  
           if($value != '') { 
            $data_array_count = ++$data_array_count; 
           } 
         } 

         //if contains atleast one variable run update code  
         if($data_array_count != 0) { 

          //loops through and inserts each varible in array 
          foreach ($data as $column => $value) { 

           //ignores variables without any data 
           if($value != '') { 
            $insert = $db->prepare("INSERT IGNORE my_table (a_id, b_id) VALUES (:a_id, :b_id)"); 
            $insert->execute(array(':a_id' => $a_id, 
                  ':b_id' => $value));   
           } 
          } 


           //sets up variables in array to remove any records that need to be deleted 
           $columns = ""; 
           $holders = ""; 
           foreach ($data as $column => $value) {  
            if($value != '') {  
             $columns .= ($columns == "") ? "" : ", "; 
             $columns .= $column; 
             $holders .= ($holders == "") ? "" : ", "; 
             $holders .= ":$column"; 
            } 
           } 


           $delete = $db->prepare("DELETE FROM my_table WHERE accessory_id NOT IN ($holders) AND (carrier_id = :a_id)"); 

          //bind value for main id  
          $delete->bindValue(":a_id", $a_id); 

          //loop to bind value for each variable stored in array with data 
          foreach($data as $placeholder => $value) { 
           if($value != '') { 
           $delete->bindValue(":" . $placeholder, $value); 
           } 
          } 

          $delete->execute();  

        } 


使用原始問題中的示例,您將不得不爲每個想要更新的c1 id號運行此代碼(在我的示例中,c1將等於$a_id變量)。