2014-10-01 59 views
-1

我有一個表結構META_ID | KEY | VALUE | USER_ID,其中META_ID是自動遞增的。現在,在我的PHP邏輯我真的需要一個自動增量ID列嗎?

1每位用戶可獲得

2的結果鍵值對刪除每個用戶的鍵值行

3更新或插入的鍵值對的已知USER_ID

4插入新用戶的鍵值對

但META_ID不斷增長,所以我想知道如果我可以只刪除META_ID列?

案例邏輯

的註冊用戶或返回註冊用戶可以更新他們的形式隨着時間的推移,如果他們還沒有提交它。因此,超時用戶可以選擇和取消選擇某些表單選項並觸發更新,插入或刪除操作。 現在,「返回用戶取消選擇一個鍵(並且該行需要被刪除)背後的邏輯」給我一個問題。這就是爲什麼我只是刪除所有用戶鍵值對。但是,正確的方法是什麼?

因此,如果鍵值存在於數據庫表中,但不在$ params中,我需要將其刪除!

順便說一句,這裏是我的功能

function user_shopping_meta_data($params) { 
     global $wpdb; 
     $shopping_meta_table = 'wp_shopping_metavalues'; 
     $wp_user_id = $params['wp_user_id']; 
     //1 CHECK IF USER HAS KEY VALUE PAIRS 
     $checkKeyValues = $wpdb->get_results("SELECT meta_shopping_key FROM $shopping_meta_table WHERE wp_user_id = '$wp_user_id'"); 
     //2 WE DELETE 
     $qdel = $wpdb->delete($shopping_meta_table, array('wp_user_id' => $wp_user_id)); 
     //3 UPDATE OR INSERT 
     foreach ($params as $key => $val) { 
      //variables 
      if (is_array($val)) { 
          $val = json_encode($val); 
         } 
      $shopping_meta_values = array(
          'wp_user_id' => $wp_user_id, 
          'meta_shopping_key' => $key, 
          'meta_shopping_value' => $val 
         ); 

      if (count($checkKeyValues) > 0) {//3 USER IS KNOWN SO UPDATE and/or INSERT new key-value 
       foreach ($checkKeyValues as $check) { 
        //UPDATE OR INSERT 
        if (($key != "wp_user_id")) {  
         //FOR UPDATE where 
         $shopping_meta_where = array('meta_shopping_key' => $key, 'wp_user_id' => $wp_user_id); 
         $result = $wpdb->get_results("SELECT * FROM $shopping_meta_table WHERE meta_shopping_key = '" . $key . "' AND wp_user_id = '$wp_user_id'"); 
         if (count($result) > 0) {//KEY ALREADY EXISTS FOR USER 
          $return .= $wpdb->update($shopping_meta_table, array('meta_shopping_key' => $key, 'meta_shopping_value' => $val), $shopping_meta_where) . '<br/>'; 
          //$return .= 'UDPATE<br/>'; 
         } else {//KEY IS NEW 
          $return .= $wpdb->insert($shopping_meta_table, $shopping_meta_values) . '<br/>'; 
//       $return .= 'INSERT for old'; 
         } 
        }//.end $key 
       }//.end foreach checkKeyValue 
      }//.end count 
      else {//4 INSERT KEY VALUE PAIR FOR NEW USER 
       if (($key != "wp_user_id")) { 
        $return .= $wpdb->insert($shopping_meta_table, $shopping_meta_values) . '<br/>'; 
//     $return .= 'INSERT NEW'; 
       } 
      } 
     }//.end each 
     echo 'Test return: ' . $return; 
    } 

回答

-1

可以很好地將其刪除。這只是一個獨特的ID。如果您可以在沒有META_ID的情況下區分不同的行,或者您不需要區分行,那麼META_ID是多餘的。

-1

如果我能給你一個建議,最好把這個領域當作歷史。 如果您需要知道爲該用戶完成的最後一個操作是什麼,您可以通過META_ID進行訂購。 在表中有一個主鍵是有用的。但這只是一個建議

-1

我建議你有一個主鍵,你可以肯定它是唯一的。爲此,使用自動增量列是一個好主意,因爲您始終可以確定它是唯一的。

2

刪除它並不會獲得太多收益。你可能會認爲你節省了一些空間,但事實上你並沒有。一個auto_increment列總是(主鍵的一部分)。如果你刪除它,MySQL將創建一個「隱式」主鍵,這對MySQL來說是不可見的,但是它是識別行所必需的。你也會失去一些安慰,如不能使用LAST_INSERT_ID()

+0

tx我不知道「隱式」主鍵。我只是想防止大數字的ID像1002093.我不知道有多大的ID可以。我添加了我的功能,也許你可以發現我的錯誤邏輯? – alex 2014-10-01 09:57:48

+1

我不是程序員,但我可以告訴你,你不必擔心數字太大。如果它是一個簡單的有符號整數,它可以大到2147483647.在大多數情況下應該足夠了。 – fancyPants 2014-10-01 10:02:36