2011-11-09 27 views
6

Tôi có một bảng liên kết 2 bảng khác với nhau.MySQL INSERT IF NOT EXIST else DELETE hàng

Tôi có một danh sách các hộp kiểm, trong đó khi một hộp kiểm được chọn, nó sẽ gửi giá trị đến máy chủ qua ajax.

Những gì tôi muốn làm là nếu giá trị không nằm trong cơ sở dữ liệu, chèn chúng (kiểm tra) hoặc nếu họ đang có, xóa chúng (đánh dấu)

Có cách nào để làm điều đó mà không cần viết một vài thắc mắc ? Tôi biết nó không khó với một chèn/cập nhật, nhưng những gì về xóa?

Trả lời

0

INSERT IF NOT EXISTS ... không có sẵn trong MySQL (nó dành riêng cho T-SQL afaik). Thay vào đó, hãy sử dụng một giao dịch nhưng hãy nhớ rằng không phải mọi công cụ MySQL đều hỗ trợ các giao dịch mặc dù không có lỗi nào được nêu ra khi sử dụng các lệnh giao dịch.

+0

Tôi biết máy chủ tôi đang thực hiện, nhưng chúng tôi sắp thay đổi máy chủ và không biết phiên bản nào hoặc những gì quản trị viên sys sẽ hoặc sẽ không cho phép bất cứ nơi nào chúng tôi kết thúc, vì vậy tôi đang cố gắng giữ nó càng cơ bản càng tốt trong thời gian tới. – guyfromfl

+0

Sử dụng một chỉ mục duy nhất và sử dụng Chèn Bỏ qua, Bằng cách này nó sẽ chèn nếu không tồn tại . bạn có thể nhận được cùng một điều thực hiện theo cách này. – Adrian

4

Bạn có thể xóa đường dẫn và, nếu các hàng bị ảnh hưởng là 0, sau đó chèn. Dễ dàng, đơn giản và nó hoạt động.

+0

Thats cách duy nhất tôi biết làm thế nào, và nghĩ rằng tôi sẽ chỉ để có được nó hơn với ... Cảm ơn – guyfromfl

0

Không phải 100% những gì bạn đang tìm kiếm, nhưng nó chèn nếu không tồn tại: 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

Không có những điều như ON DUPLICATE DELETE hoặc sử dụng đúng NẾU ELSE với truy vấn con để làm điều đó trong một truy vấn (điều này sẽ hữu ích vì một truy vấn này sẽ thành công hoặc thất bại). Hãy suy nghĩ bạn sẽ phải cuộn qua một số truy vấn để đạt được mục tiêu của mình, như tôi đã làm. Nhưng theo dõi xem liệu các truy vấn tiếp theo có tiếp tục hay không.

Bắt đầu với giá trị trả lại ('trạng thái' trong trường hợp này) là "Không xác định" hoặc "Không đổi". Nếu điều này trả về cho bạn cuộc gọi ajax, bạn biết hộp kiểm cần quay lại trạng thái trước đó của nó trước khi nhấp và có thể bật lên một thông báo (bạn có thể mang theo cùng với json).

chạy truy vấn của bạn theo cấu trúc mã đúng/sau đó và theo dõi các truy vấn thành công và cập nhật 'trạng thái' khi chuỗi thành công tương ứng. Điều này nên làm chính xác những gì bạn cần, giữ cho nó khỏi bị lỗ đen.

(Tôi sử dụng một số giấy gói để chạy các truy vấn, mà trở về đúng/sai/null/errorinformation - cho phép bạn kiểm tra từng kết quả truy vấn)

Tôi giả sử bạn có cuộc gọi ajax của bạn tại chỗ rồi. Ví dụ mã bắt đầu khi cuộc gọi ajax của bạn bắt đầu xử lý từ phía máy chủ:

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;