使用where语句批量更新mysql

use*_*384 28 mysql bulk sql-update

如何批量更新mysql数据?如何定义这样的东西:

UPDATE `table` 
WHERE `column1` = somevalues
SET  `column2` = othervalues
Run Code Online (Sandbox Code Playgroud)

与某些值如下:

VALUES
    ('160009'),
    ('160010'),
    ('160011');
Run Code Online (Sandbox Code Playgroud)

和其他值:

VALUES
    ('val1'),
    ('val2'),
    ('val3');
Run Code Online (Sandbox Code Playgroud)

也许用mysql不可能?一个PHP脚本?

Far*_*ide 47

在您的情况下,最简单的解决方案是使用ON DUPLICATE KEY UPDATE构造.它的工作速度非常快,并且可以轻松完成工作.

INSERT into `table` (id, fruit)
    VALUES (1, 'apple'), (2, 'orange'), (3, 'peach')
    ON DUPLICATE KEY UPDATE fruit = VALUES(fruit);
Run Code Online (Sandbox Code Playgroud)

或使用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);
Run Code Online (Sandbox Code Playgroud)

  • 请小心 MySQL 中的“ON DUPLICATE KEY”语句,即使您没有插入新行,它们也会导致您的 auto_increment 列增加。如果您使用“ON DUPLICATE KEY”进行批量更新,您可以非常快速地烧毁大量 auto_increment 值。确保您的 auto_increment 字段足够大以允许这样做。 (3认同)
  • 这个“ON DUPLICATE KEY”看起来像是一个很好的技术,但是请注意(没有mysql)如果表中的任何字段没有默认值,它将无法执行。因此,您必须推送一些占位符值来通过此限制,这会降低此解决方案的可移植性。 (2认同)

Dav*_*vis 8

如果您拥有的“批量”数据是动态的并且来自 PHP(毕竟您确实标记了它),那么查询将如下所示:

INSERT INTO `foo` (id, bar)
VALUES 
    (1, 'pineapple'),
    (2, 'asian pear'),
    (5, 'peach')
ON DUPLICATE KEY UPDATE bar = VALUES(bar);
Run Code Online (Sandbox Code Playgroud)

以及从现有数组生成它的 PHP(假设数组的格式如下:

$array = (
    somevalues_key => othervalues_value
);
Run Code Online (Sandbox Code Playgroud)

) 看起来像这样(绝不是最好的(例如,不解决转义或清理值),只是一个简单的例子):

$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)";
Run Code Online (Sandbox Code Playgroud)