是否可以在一个语句中有条件地将多个值插入MySQL表中?

时间:2012-02-24 21:38:29

标签: mysql insert

我阅读了this question,其中重点介绍了一种有条件地将值插入表中的解决方案(如果它们尚不存在)。我的问题:是否可以一次有条件地插入多个值。

例如,假设我有一个只包含用户名的表(这是一个没有意义的表,但让我们保持简单)。表的内容如下所示:

matthew  20
mark     24
luke     25
john     56
buddy    68

用户在Web表单中输入jimmy 34,标记25和bobby 54并提交,我想检查表中是否存在这三个值,并在一个语句中插入不存在的值。是的,对于这个例子,我假设名字是唯一的。

以下是我链接到的问题代码段的解释,适用于此示例:

INSERT INTO users(name) 
SELECT 'jimmy'
    FROM dual
    WHERE NOT EXISTS (SELECT * FROM users
                         WHERE user = 'jimmy')

如何对多次插入的值进行调整?解决方案的工作方式与输入的值的数量无关,这一点也很重要。在我的例子中,我给了三个(jimmy,mark和bobby),但可能只有一个或者可能有20个。

第二个问题:这是明智的吗?我知道减少查询数量是可取的,但这值得吗?我应该只设置一个for循环并循环,交替检查一个值是否存在,如果不存在则插入?

感谢您的帮助。

抱歉,我没有自己试图展示的代码,我甚至不确定在这里尝试一下。

更新:在表格中添加了一个额外的列。我想保持简单,但需要两列来说明删除行然后插入或更新的事实并不是我想要的,因为他们更倾向于用户对表中已有内容的输入。

3 个答案:

答案 0 :(得分:0)

我在编程方面不是很大(特别是在php上),但你可以将字符串解析成单独的名字,然后进行循环吗?

类似的东西(希望语法有些正确)

$names = split(" ", $user_names);
for ($i=0; $i<count($names); i++)
 {
  //sql query check - add new name function
  function_sql_query($names[$i]);
 }

此外,您可以向SQLDBMS添加规则以禁止此属性中的dublicates并仅添加唯一记录;这个过程将由DBMS维护

答案 1 :(得分:0)

请参阅相关字段中的INSERT IGNORE和UNIQUE KEY。

当唯一键约束失败时,将自动忽略整行。

ALTER TABLE users ADD UNIQUE KEY `name` (`name`);
INSERT IGNORE INTO `users` (`name`, `age`) 
  VALUES ("jimmy", 22), ("bob", 45), 
         ("luke", 300), ("john", 456);

注意:当数据类型不匹配且无法准确转换时,这也会抑制错误。 (例如DECIMAL vs INT)MySQL将继续使用最接近的结果。 (例如INT)您应确保仅使用此类语句插入预先验证的数据。

答案 2 :(得分:-1)

您可以使用MySQL的REPLACE

http://dev.mysql.com/doc/refman/5.0/en/replace.html

OR INSERT ... ON DUPLICATE KEY UPDATE

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c;