2011-11-09 91 views
6

我有一張表,鏈接2個其他表在一起。MySQL插入如果不存在其他刪除行

我有一個複選框列表,其中當選中一個複選框時,它通過ajax將值發送到服務器。

我想要做的是如果值是不是在數據庫中,將它們插入(檢查),或者如果他們在那裏,刪除它們(選中)

有沒有辦法做到這一點,而無需編寫幾個查詢?我知道它不難以插入/更新,但刪除呢?

回答

0

INSERT IF NOT EXISTS ...在MySQL中不可用(它特定於T-SQL afaik)。請使用事務,但請記住,並非每個MySQL引擎都支持事務,但在使用事務語句時不會引發錯誤。

+0

我知道我dev'ing對服務器的操作,但我們要儘快改變主機,不知道是什麼版本或者什麼系統管理員將會或不會允許我們結束,所以我儘量保持它儘可能基本。 – guyfromfl

+0

使用一個唯一的索引並使用插入忽略,這樣它將插入如果不存在。你可以通過這種方式來完成相同的事情。 – Adrian

4

你可以全部刪除,如果受影響的行是0,則插入。簡單,簡單,它的工作原理。

+0

多數民衆贊成我知道如何,並認爲我只是想把它與...唯一的方法感謝 – guyfromfl

0

不是100%,你所尋找的,但它確實插入,如果不存在: http://remy.supertext.ch/2010/11/mysqlupdate-and-insert-if-not-exists/

INSERT INTO wp_postmeta (post_id, meta_key) SELECT ?id, ‘page_title’ 
FROM DUAL WHERE NOT EXISTS (
    SELECT meta_id FROM wp_postmeta WHERE post_id = ?id AND meta_key = ‘page_title’); 
UPDATE wp_postmeta SET meta_value = ?page_title WHERE post_id = ?id AND meta_key = ‘page_title’; 
0

有作爲對重複刪除沒有這樣的事情或正確使用IF ELSE與子查詢在一個查詢中執行此操作(這將很方便,因爲這一個查詢將成功或失敗)。想想你不得不經過幾次查詢來實現你的目標,就像我一樣。但要跟蹤後續查詢是否繼續成功。

從「未知」或「NoChange」開始返回一個返回值(本例中爲'狀態')。如果這返回給你ajax調用,你知道該複選框需要在點擊之前返回到它以前的狀態,並且可能彈出一條消息(你可以攜帶json)。

在正確的if/then代碼結構中運行您的查詢,並跟蹤後續查詢,並在系列相應成功時更新'狀態'。 這應該完全符合你的需求,避免出現黑洞。

(我用一些包裝用於運行查詢,返回真/假/空/ errorinformation - 這允許你檢查每個查詢結果)

我假設你有你的Ajax調用已經到位。該代碼示例從哪裏開始你的Ajax調用從服務器端開始處理:

ob_end_clean(); 
    $json = array("state" => "Unknown"); 
    $module_id = (isset($_POST['module_id']) ? $_POST['module_id'] : null); 
    $group_id = (isset($_POST['group_id']) ? $_POST['group_id'] : null); 
    $action = (isset($_POST['action']) ? $_POST['action'] : null); 
    if (!empty($module_id) && !empty($group_id) && !empty($action)) { 
     $query = " 
      SELECT 
       1 
      FROM 
       config_module_actions_groups 
      WHERE 
       1 
       AND module_id = '{$module_id}' 
       AND group_id = '{$group_id}' 
       AND action = '{$action}' 
     "; 
     if (getQueryAsArraySingleValues($query)) { 
      $query = " 
       DELETE FROM 
        config_module_actions_groups 
       WHERE 
        1 
        AND module_id = '{$module_id}' 
        AND group_id = '{$group_id}' 
        AND action = '{$action}' 
       "; 
      if (executeQuery($query)) { 
       $json["state"] = "Off"; 
      } else { 
       $json["message"] = "Not correctly deactivated"; 
      } 
     } else { 
      $query = " 
       REPLACE INTO 
        config_module_actions_groups 
       SET 
        module_id = '{$module_id}', 
        group_id = '{$group_id}', 
        action = '{$action}' 
      "; 
      if (executeQuery($query)) { 
       $json["state"] = "On"; 
      } else { 
       $json["message"] = "Not correctly activated"; 
      } 
     } 
    } 
    // output 
    echo json_encode($json); 
    exit;