使用 where 语句批量更新 mysql
Posted
技术标签:
【中文标题】使用 where 语句批量更新 mysql【英文标题】:Bulk update mysql with where statement 【发布时间】:2016-06-14 02:34:09 【问题描述】:如何批量更新mysql数据? 如何定义这样的东西:
UPDATE `table`
WHERE `column1` = somevalues
SET `column2` = othervalues
带有一些值,例如:
VALUES
('160009'),
('160010'),
('160011');
和其他价值观:
VALUES
('val1'),
('val2'),
('val3');
也许用 mysql 是不可能的? 一个php脚本?
【问题讨论】:
将您的配对放入查找表中,并通过该表加入以创建您的更新。 你检查过这个答案***.com/questions/12960569/mysql-bulk-insert-via-php 可以用MySQL完成,不涉及PHP。在下面查看我的答案,它就像一个魅力。 【参考方案1】:在您的情况下,最简单的解决方案是使用 ON DUPLICATE KEY UPDATE
构造。它的工作速度非常快,并且可以轻松完成工作。
INSERT into `table` (id, fruit)
VALUES (1, 'apple'), (2, 'orange'), (3, 'peach')
ON DUPLICATE KEY UPDATE fruit = VALUES(fruit);
或者使用CASE
构造
UPDATE table
SET column2 = (CASE column1 WHEN 1 THEN 'val1'
WHEN 2 THEN 'val2'
WHEN 3 THEN 'val3'
END)
WHERE column1 IN(1, 2 ,3);
【讨论】:
即使fruit
列不是唯一的,也可以安全使用吗?我对 mysql 文档中的语句感到困惑:“如果您指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则会发生旧行的更新” dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html.
@swdon,您提出的问题与MySQL的基本知识相矛盾。主键是唯一的。根据定义,表的primary key 是唯一键。
对不起,我真的搞混了。在我的情况下,主键是一个自动递增的值,更新语句正在检查其他一些既不是主键也不是唯一的列。但我明白了你在原始答案中的意思。
这个“ON DUPLICATE KEY”看起来是个不错的技术,但是请注意(没有mysql)如果表中的任何字段没有默认值,它将无法执行。因此,您必须推送一些占位符值才能通过此限制,这会降低此解决方案的可移植性。
小心 MySQL 中的“ON DUPLICATE KEY”语句,即使您没有插入新行,它们也会导致您的 auto_increment 列增加。如果您使用“ON DUPLICATE KEY”进行批量更新,您可以非常快速地消耗大量 auto_increment 值。确保您的 auto_increment 字段足够大以允许此操作。【参考方案2】:
如果您拥有的“批量”数据是动态的并且来自 PHP(毕竟您确实对其进行了标记),那么查询将如下所示:
INSERT INTO `foo` (id, bar)
VALUES
(1, 'pineapple'),
(2, 'asian pear'),
(5, 'peach')
ON DUPLICATE KEY UPDATE bar = VALUES(bar);
和 PHP 从现有数组生成它(假设数组的格式如下:
$array = (
somevalues_key => othervalues_value
);
) 看起来像这样(绝不是最好的(例如,不解决转义或清理值的问题),只是一个简单的例子):
$pairs = array();
foreach ($array as $key => $value)
$pairs[] = "($key, '$value')";
$query = "INSERT INTO `foo` (id, bar) VALUES " . implode(', ', $pairs) . " ON DUPLICATE KEY UPDATE bar = VALUES(bar)";
【讨论】:
戴维斯,当我运行您编写的顶部语句时,它在只有 id 和 bar 列的表中工作。但是如果表格包含的不仅仅是 id 和 bar,例如 id,bar,date,它就不起作用。即使不需要更新,您是否必须指定每一列? @Bonxy,在这种情况下,您的查询应该修改如下,它确实对我有用。插入foo
(id, bar, date) 值 (1, 'pineapple', d1), (2, 'asian pear', d2), (5, 'peach', d3) ON DUPLICATE KEY UPDATE bar = VALUES (bar), date=values(date);【参考方案3】:
如果你有数组格式的数据,那么试试这个
你的查询就像"UPDATE table WHERE column1 = ? SET column2 = ?"
然后像下面这样设置
foreach($data as $key => $value)
$query->bind_param('ss', $key, $value);
$query->execute();
希望它会起作用。
来自this的参考。
【讨论】:
以上是关于使用 where 语句批量更新 mysql的主要内容,如果未能解决你的问题,请参考以下文章