2011-11-09 12 views
6

2つの他のテーブルをリンクするテーブルがあります。MySQL INSERTが存在しない場合その他の行が削除されます

私はチェックボックスのリストを持っています。チェックボックスをオンにすると、その値をajax経由でサーバーに送信します。

私がやりたいことの値がデータベースにない場合は、それらを挿入する(チェック)またはそれらが存在する場合、それらを削除(チェック)

いくつかのクエリを記述することなく、それを行う方法はあります?私は挿入/更新で難しくないことを知っていますが、削除についてはどうですか?

答えて

0

INSERT IF NOT EXISTS ...はMySQLでは使用できません(これはT-SQL afaikに固有です)。代わりにトランザクションを使用しますが、トランザクション文を使用するときにエラーは発生しませんが、すべてのMySQLエンジンがトランザクションをサポートするわけではありません。

+0

私は開発しているサーバーを知っていますが、すぐにホストを変更する予定で、どのバージョンまたはsysの管理者が私たちがどこにいても許してくれないものがあるので、私は可能な限り基本的なままにしておきます。 – guyfromfl

+0

一意のインデックスを使用して、Insert Ignoreを使用します。 。このようにして同じことをすることができます。 – 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

をDUPLICATE ONのようなもの削除するか、サブクエリとELSE IFの正しい使用はありませんこれを1つのクエリで行います(この1つのクエリは成功するか失敗するので便利です)。私のように、あなたの目標を達成するためにいくつかのクエリをロールオーバーしなければならないと思います。しかし、後続のクエリが成功し続けるかどうかを追跡します。

"Unknown"または "NoChange"の戻り値(この場合は 'state')から始めます。これがあなたにajaxコールを返した場合、チェックボックスをクリックする前の状態に戻る必要があり、可能なポップアップメッセージが表示されていることがわかります(これはjsonと一緒に実行できます)。

正しいif/thenコード構造でクエリを実行し、後続のクエリを追跡し、それに応じてシリーズが成功したときに '状態'を更新します。 これはあなたが必要とするものを正確に実行し、ブラックホールがないようにします。

(私は真/偽/ nullを/エラー情報を返すクエリを実行するためのいくつかのラッパー、使用 - あなたは各クエリの結果を確認することができます)

私はすでに場所であなたの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; 
関連する問題