如何批量更新mysql数据? 如何定义这样的东西:
UPDATE `table`
WHERE `column1` = somevalues
SET `column2` = othervalues
有一些值,例如:
VALUES
('160009'),
('160010'),
('160011');
和其他值:
VALUES
('val1'),
('val2'),
('val3');
也许 mysql 不可能? 一个 PHP 脚本?
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);
如果您拥有的“批量”数据是动态的并且来自 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)";
您可以尝试使用 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 性能提升,具体取决于您的表大小)。
如果您使用拖放 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)).");
");
}
您可以使用临时表。
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;
如果您有数组格式的数据,请尝试这个
你的查询就像
"UPDATE table WHERE column1 = ? SET column2 = ?"
然后如下设置
foreach($data as $key => $value) {
$query->bind_param('ss', $key, $value);
$query->execute();
}
希望它能起作用。
参考自this。