【问题标题】:problem of insert multiple values with WHERE NOT EXISTS使用 WHERE NOT EXISTS 插入多个值的问题
【发布时间】:2011-09-23 09:31:37
【问题描述】:

我想将表单中的多条记录插入名为“user”的表中,并且从表单提交的“items”值在另一个表名“order”中不存在。 “订单”表中只有 2 个字段,即 id 和 items。

这是我的代码:

INSERT INTO user (id, username, email, address, items)
SELECT '$username1', '$email1', '$address1', '$items1'
UNION ALL
SELECT '$username2', '$email2', '$address2', '$items2'
UNION ALL
SELECT '$username3', '$email3', '$address3', '$items3'
FROM DUAL 
WHERE NOT EXISTS(SELECT item FROM order)

假设“项目”表包含 2 组数据:

  id        items
1         table01 
2         chair01

所以当我插入数据时:

john, john@hotmail.com, 12, Street, nail01 
jennifer, jennifer@yahoo.com, 13, Street, table01
peter, peter@live.com, 14, Street, spoon01
(defintely these data are keyin in the form)

假设第二条记录不会插入到“用户”表中,因为“项目”表中已经包含该项目。 但现在结果是第 1 和第 2 数据将插入到“用户”表中,而第 3 数据则没有。我用其他代码尝试了很多次,但仍然没有成功。

谁能给我一个建议? 谢谢。

【问题讨论】:

    标签: insertion


    【解决方案1】:

    我对你想要做的事情有点困惑,如果我错了,请纠正我,但这是我从你的问题中理解的:

    您想从表单将数据添加到用户表中,但您只想添加订购了项目表中尚不存在的项目的用户?

    ------ 这已经确认了------

    好吧,这就是我的做法。

    所以您正在使用 POST 方法从表单中收集数据。

    $_POST['email'] 等等。你想确保收集到的数据是 100% 干净的,所以我使用了我创建的一个方便的小 cleanString 函数......

    function cleanString($var)
    {
        $var = strip_tags($var); //Removes all HTML tags
        $var = htmlentities($var); //Converts characters into HTML entities
        $var = stripslashes($var); //Removes any backslashes
        return mysql_real_escape_string($var); // Escapes all special characters
    }
    

    并且会像这样使用它......

    $email = cleanString($_POST['email']);
    $item = cleanString($_POST['item']);
    

    等等……

    您现在想要检查订单表中是否存在所有干净数据。所以按照以下方式进行查询:

    $query = "SELECT items FROM order WHERE items=".$item;
    $result = mysql_query($query);
    

    然后检查是否找到结果

    if(mysql_num_rows($result) > 0)
    {
        // Result found do not process...
    }
    else
    {
        // Result not found, process...
        $query = "INSERT INTO user ...";
    }
    

    如果您一次执行多个插入操作,您可以将其全部包装在 while 或 foreach 循环中以一次性处理所有内容。虽然考虑到它来自一个表单,但我猜你一次只能有 1 个输入?

    希望这会有所帮助。

    -------添加一个while循环------

    所以您想一次性添加多条记录,这完全取决于您如何从表单中收集数据,要给出准确的答案,我需要更多关于您如何从表单中收集数据的信息形式。您是每个字段有 3 个以一次添加 3 个人,还是将所有数据保存到数组中以供以后处理?

    如果您将所有内容都放入数组中,那么这些方法将起作用

    foreach ($array as $user)
    {
        $item = $user['item']
        etc...
    
        $query = "SELECT items FROM order WHERE items=".$item;
        $result = mysql_query($query);
    
        if(mysql_num_rows($result) > 0)
        {
            // Result found do not process...
        }
        else
        {
            // Result not found, process...
            $query = "INSERT INTO user ...";
        }
    }
    

    这将逐个获取每个用户,获取该用户的所有数据,检查该项目是否存在,如果不存在则处理。

    你也可以用一个while循环来做,但如果不知道你是如何获取数据的,这种方式很难解释

    【讨论】:

    • 我需要插入多条记录意味着我需要写 $query = "SELECT items FROM order WHERE items=".$item1 OR items=".item2 OR items=".item3;等等?
    • 如果您要添加多条记录,那么如果您将整个内容包装在一个while循环中,那么对于每组数据,它将执行检查,然后处理或不处理。 - 生病编辑我的答案来尝试解释
    • 实际上我想要的主要是从表单中进行多次插入。例如,我要插入的总记录为 5,但在“订单”表中找到 1 个项目,因此我需要跳过该项目,但仍会插入与“订单”表中的记录不匹配的另外 4 条记录。同时,我需要告知插入了哪些记录,没有插入了哪些记录。对此有什么想法吗?
    • 这可以在 if 语句中轻松完成,如果处理完毕,您可以将用户名添加到数组或变量中,以便稍后在屏幕上显示
    【解决方案2】:

    这似乎是 Oracle 语法……是吗?

    INSERT INTO user (id, username, email, address, items)
    

    您需要插入 id 但不要这样做。如果它由序列和触发器填充,那没关系,但不需要插入它。

    INSERT INTO user (username, email, address, items)
    SELECT '$username1', '$email1', '$address1', '$items1'
    UNION ALL
    SELECT '$username2', '$email2', '$address2', '$items2'
    UNION ALL
    SELECT '$username3', '$email3', '$address3', '$items3'
    FROM DUAL 
    WHERE NOT EXISTS(SELECT item FROM order)
    
    • 您需要在每个联合部分中使用“FROM DUAL”
    • 您的 WHERE 子句仅影响第三个选择
    • 它也没有多大意义:'如果表顺序中没有行,则选择这一行'。您将需要指定您的排除项。我添加了一个连接(WHERE a.items = items),所以现在只有在订单表中不存在该项目已经存在的行时才会插入一行。看起来很狡猾,您需要提供更多信息。

    你的意思可能是

    INSERT INTO user (username, email, address, items)
    SELECT username, email, address, items FROM (
       SELECT '$username1' username, '$email1' email, '$address1' address, '$items1' items
         FROM DUAL
       UNION ALL
       SELECT '$username2' username, '$email2' email, '$address2' address, '$items2' items
         FROM DUAL
       UNION ALL
       SELECT '$username3' username, '$email3' email, '$address3' address, '$items3' items
         FROM DUAL
    ) a
    WHERE NOT EXISTS(SELECT 1 FROM order WHERE a.items = items)
    

    如果您的表“订单”在“项目”列上定义了唯一键,那么是的,当您尝试插入新项目时,您的插入将失败。更好的做法是首先查询您的订单表以检查该项目是否已经存在,如果不存在,则创建它。

    就像 AdriftUniform 所说,需要更清晰的信息!

    【讨论】:

    • 我使用的是 php 而不是 oracle ..所以不需要使用 INSERT 但是 SELECT ?'a'代表什么?我是 php 和 mysql 的新手..谢谢你的帮助!
    • a 是 select 语句子查询的别名,必须在“不存在”子句中引用它。哦,你当然需要插入,我的选择只是你将用于插入语句的子集。生病编辑。尽管我认为我的答案不再相关,但在您使用 AdriftUniform 清除它之后!
    猜你喜欢
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2019-05-18
    • 2015-04-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多