使用WHERE NOT EXISTS插入多个值的问题

时间:2011-09-23 09:31:38

标签: insertion

我想将表单中的多个记录插入名为“user”的表中,表单中提交的“items”值不存在于另一个表名“order”中。 '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)

让我们说'items'表包含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)

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

有人能给我一个建议吗? 感谢。

2 个答案:

答案 0 :(得分:0)

我对你要做的事感到有些困惑,如果我错了就纠正我,但这是我从你的问题中理解的:

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

------现在确认------

这就是我要去做的事情。

所以你使用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循环中,以便一次性处理它。虽然考虑到它来自一个表格,我猜你一次只能输入一个?

希望这会有所帮助。

-------添加一个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循环执行此操作,但这种方式很难在不知道如何获取数据的情况下解释

答案 1 :(得分:0)

这看起来像是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子句仅影响第3次选择
  • 它没有多大意义:'如果表顺序中没有行,则选择此行'。您需要指定排除。我添加了一个连接(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)

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

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