今天遇到一個數據的批量更新,查了一下官方文檔,還好找到了。英文東東,大家耐心哈
http://dev.mysql.com/doc/refman/5.7/en/update.html
一般在使用數據編輯的時候:
UPDATE tablename SET field_1='value', field_2='value'[...] WHERE condition_field= 'value'
或者
UPDATE tablename SET field_1='value', [field_2...] where condition_field in ('values')
如果更新多條數據爲不同的值,怎麼做呢?
可能大部分人會這麼寫:
foreach($conditions as $field => $value){ $sql = "UPDATE tablename SET field = $value WHERE id = $id"; mysql_query($sql); }
這樣進行一條一條數據進行更新,這樣的效率比較低。
有沒有一條sql來進行操作的呢?其實mysql並沒有提供直接的方法來操作,大家可以看靠一下官方文檔,不過是英文的仔細看一下哦
(官方文檔:http://dev.mysql.com/doc/refman/5.7/en/update.html)
UPDATE tablename SET field = CASE id WHERE 1 THEN 'value' WHERE 2 THEN 'value' END WHERE id in (1,2,3)
更新多個字段呢?
UPDATE tablename SET field_1 = CASE id WHERE 1 THEN 'value' WHERE 2 THEN 'value' END, field_2 = CASE id WHERE 1 THEN 'value', WHERE 2 THEN 'value' END WHERE id in (1,2,3)
思路大致就是這樣的,如果是PHP那麼可以參考一下寫的方法:
/** * 批量更新數據,必須是二位數組 * * @param array $data 需要跟新的數據 * 比如:$data['字段名稱']['主鍵ID']=>'value' * * @return boolean */ public function updateAll($data, $dbname) { if (empty($data)) { return false; } $sql = "UPDATE ".$dbname." SET "; $total = count($data); $i = 1; $idsArr = array(); foreach ($data as $field => $val) { $sql .= " $field = CASE id "; foreach ($val as $id => $v) { $sql .= sprintf(" WHEN %d THEN '%s' ", $id, $v); if (!in_array($id, $idsArr)) { $idsArr[] = $id; } } if ($i == $total) { $sql .=" END "; } else { $sql .=" END, "; } $i++; } $ids = implode(',', $idsArr); $sql .= " WHERE id IN ($ids)"; //TODO 具體執行的方法就自己寫了( ̄▽ ̄)" }