使用where语句批量更新mysql

问题描述 投票:0回答:6

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

UPDATE `table` 
WHERE `column1` = somevalues
SET  `column2` = othervalues

有一些值,例如:

VALUES
    ('160009'),
    ('160010'),
    ('160011');

和其他值:

VALUES
    ('val1'),
    ('val2'),
    ('val3');

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

mysql sql-update bulk
6个回答
131
投票

您的情况最简单的解决方案是使用

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);

13
投票

如果您拥有的“批量”数据是动态的并且来自 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)";

2
投票

您可以尝试使用 JOIN 进行更新,如下所示:

UPDATE table
INNER JOIN (
            SELECT 1 column1, 2 column2, 10 new_v1, 20 new_v2, 30 new_v3
  UNION ALL SELECT 4 column1, 5 column2, 40 new_v1, 50 new_v2, 60 new_v3
) updates
  ON table.column1 = updates.column1
  AND table.column2 = updates.column2
SET
  table.column1 = updates.new_v1,
  table.column2 = updates.new_v2,
  table.column3 = updates.new_v3;

只要您可以从

SELECT
子查询中制作内部
updates
语句,您就会受益于在单个语句中运行所有这些更新(这应该会给您带来一些 InnoDB 性能提升,具体取决于您的表大小)。


0
投票

如果您使用拖放 tableView 或 collectionView 对应用中的数据进行排序,例如允许用户通过拖放功能排列照片,请在用户编辑完成后将逗号分隔的有序 id 列表发送到后端。

在你的后端,将 ids 分解为数组,例如

$new_ranks = array();
$supplied_orders = explode(",", $_POST["supplied_new_order"]); //52,11,6,54,2 etc
$start_order = 99999;
foreach ($supplied_orders as $supplied_row_id) {
    //your all validations... make sure supplied_row_id belongs to that user or not etc..

    $new_ranks[intval($supplied_row_id)] = $start_order--;
}

现在,您可以更新所有新排名,例如@Farside推荐2。

if (count($new_ranks) > 0) {
    $case_sqls = array(); 
    foreach ($new_ranks as $id => $rank) {
        $case_sqls[] = "WHEN ".intval($id)." THEN ".intval($rank)."";
    } 
    $case_sql = implode(" ", $case_sqls);

    $this->db->query("
        UPDATE 
            service_user_medias
        SET 
            rank = (CASE id ".$case_sql." END)
        WHERE 
            id IN(".implode(",", array_keys($new_ranks)).");
    ");
}

0
投票

您可以使用临时表。

CREATE TABLE `foo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bar` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `foo` (`id`, `bar`) VALUES (1, 'a'), (2, 'b');
CREATE TEMPORARY TABLE `foo_tmp` LIKE `foo`;
INSERT INTO `foo_tmp` (`id`, `bar`) VALUES (1, 'c'), (2, 'd');
UPDATE `foo` f INNER JOIN foo_tmp ft ON f.id = ft.id SET f.bar = ft.bar;


-7
投票

如果您有数组格式的数据,请尝试这个

你的查询就像

"UPDATE table WHERE column1 = ? SET  column2 = ?"

然后如下设置

foreach($data as $key => $value) {
    $query->bind_param('ss', $key, $value);
    $query->execute();
}

希望它能起作用。

参考自this

© www.soinside.com 2019 - 2024. All rights reserved.