使用 where 语句批量更新 mysql
Bulk update mysql with where statement
如何批量更新mysql数据?
如何定义这样的东西:
UPDATE `table`
WHERE `column1` = somevalues
SET `column2` = othervalues
一些值如:
VALUES
('160009'),
('160010'),
('160011');
和其他值:
VALUES
('val1'),
('val2'),
('val3');
也许 mysql 不可能?
php 脚本 ?
如果你有数组格式的数据,那么试试这个
您的查询类似于 "UPDATE table WHERE column1 = ? SET column2 = ?"
然后像下面这样设置
foreach($data as $key => $value) {
$query->bind_param('ss', $key, $value);
$query->execute();
}
希望它能奏效。
引用自this。
针对您的情况,最简单的解决方案是使用 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);
如果您拥有的 "bulk" 数据是动态的并且来自 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)";
如果您使用拖放 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)).");
");
}
如何批量更新mysql数据? 如何定义这样的东西:
UPDATE `table`
WHERE `column1` = somevalues
SET `column2` = othervalues
一些值如:
VALUES
('160009'),
('160010'),
('160011');
和其他值:
VALUES
('val1'),
('val2'),
('val3');
也许 mysql 不可能? php 脚本 ?
如果你有数组格式的数据,那么试试这个
您的查询类似于 "UPDATE table WHERE column1 = ? SET column2 = ?"
然后像下面这样设置
foreach($data as $key => $value) {
$query->bind_param('ss', $key, $value);
$query->execute();
}
希望它能奏效。
引用自this。
针对您的情况,最简单的解决方案是使用 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);
如果您拥有的 "bulk" 数据是动态的并且来自 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)";
如果您使用拖放 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)).");
");
}