我阅读了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循环并循环,交替检查一个值是否存在,如果不存在则插入?
感谢您的帮助。
抱歉,我没有自己试图展示的代码,我甚至不确定在这里尝试一下。
更新:在表格中添加了一个额外的列。我想保持简单,但需要两列来说明删除行然后插入或更新的事实并不是我想要的,因为他们更倾向于用户对表中已有内容的输入。
答案 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;