MySQL INSERT IF NOT EXIST else DELETE行

时间:2011-11-09 21:19:33

标签: mysql

我有一张表将另外两张桌子连在一起。

我有一个复选框列表,当选中一个复选框时,它会通过ajax将值发送到服务器。

我想要做的是,如果值不在数据库中,插入(检查)或是否存在,删除它们(未选中)

有没有办法在不编写多个查询的情况下执行此操作?我知道插入/更新并不难,但删除呢?

5 个答案:

答案 0 :(得分:5)

您可以继续删除,如果受影响的行为0,则插入。简单,简单,有效。

答案 1 :(得分:0)

INSERT IF NOT EXISTS ...在MySQL中不可用(它特定于T-SQL afaik)。请改用事务,但请记住,并非每个MySQL引擎都支持事务,尽管使用事务语句时不会引发错误。

答案 2 :(得分:0)

根据您的关键结构http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html

,这可能会对您有所帮助

否则你可能能够处理你在子查询中所做的事情吗?

答案 3 :(得分: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’;

答案 4 :(得分:0)

没有ON DUPLICATE DELETE或正确使用带有子查询的IF ELSE来在一个查询中执行此操作(这将非常方便,因为这一个查询将成功或失败)。认为你必须像我一样滚动几个查询来实现你的目标。但要跟踪后续查询是否继续成功。

以返回值(本例中为“state”)开头,即“Unknown”或“NoChange”。如果这返回给你ajax调用,你知道复选框需要在点击之前返回到它之前的状态,并且可能弹出一条消息(你可以随json一起携带)。

以正确的if / then代码结构运行查询,并跟踪后续查询,并在系列成功相应时更新“状态”。 这应该完全符合您的需要,避免黑洞。

(我使用一些包装器来运行查询,返回true / false / null / 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;