MySQL 中实现数据的批量修改

今天遇到一个数据的批量更新,查了一下官方文档,还好找到了。英文东东,大家耐心哈

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 具体执行的方法就自己写了( ̄▽ ̄)" 
	}
时间: 2024-09-29 21:54:36

MySQL 中实现数据的批量修改的相关文章

MySql 同一个列中的内容进行批量修改

问题重现: MySql 数据库中,一给列的内容中包括 ".wmv"     需要将 "." 后的wmv格式 换为"flv" 解决办法 update video_info set file_path=substring(file_path,1,length(file_path)-3); 先执行以上SQL进行删除: update video_info set file_path = concat(file_path,'flv'); 再执行这条语句把f

MySQL中删除数据的两种方法

转自:http://blog.csdn.net/apache6/article/details/2778878 在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句. DELETE语句可以通过WHERE对要删除的记录进行选择.而使用TRUNCATE TABLE将删除表中的所有记录.因此,DELETE语句更灵活. 如果要清空表中的所有记录,可以使用下面的两种方法: DELETE FROM table1 TRUNCATE TABLE table1 其

Vusual C++连接Mysql和从MySql中取出数据的API介绍

.1 mysql_real_connect() 2.1.1 函数原型: MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag) 2.1.2 参数说明: • 第一个参数应该是一个现存MYSQL结

辛星浅谈mysql中的数据碎片以及引擎为MyISAM下的操作

对于mysql中的数据碎片,其实和我们删除数据是息息相关的,删除数据的时候必然会在数据文件中造成不连续的空白空间,对于少量的数据的删除,并不会产生多少的空白空间.如果在一段时间内的大量的删除操作,会使得这种留空的空间变得比存储列表内容所使用的空间更大.可能有人会说,我们向数据库中插入数据的时候,会不会在这些空白空间中插入数据呢?答案是会的.但是,它会造成一个后果,那就是数据的存储位置不连续,以及物理存储顺序与理论上的存储顺序不相同,这就比较麻烦了. 按照数据碎片的大小来分,可以分为单行数据碎片和

mysql中的数据备份与还原

一.有三种备份方式: 1. 数据表文件备份 2. 单表数据备份 3. SQL备份 4. 增量备份 二.mysql中的存储引擎 主要有两种:myisam 和 innodb. -- 免费的 其他收费的还有:BDB, Memory, Archive innodb的存储方式:表结构单独存放,所有数据都存储在ibdata1文件中. myisam的存储方式:表.数据和索引全部单独分开存储. 二.数据表文件备份与还原 直接复制数据库目录下的文件夹复制对应的表结构和数据文件,还原的时候直接放回去即可. 但是此方

servlet调用mysql中的数据

给大家介绍一个servlet.jsp和mysql之间简单的相互转换(就是使用页面访问数据库),以数据库中table表格为例. 1.建立一个servlet,命名为Check,把数据库中数据掉取出来 Connection con = Connect.get();//之前分装好类(上个博客说过) try { Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from dvd1");//

PHP无限循环取MySQL中的数据。

最近公司有个需求需要从MySQL获取数据,然后在页面上无线循环的翻页展示.主要就是一直点击一个按钮,然后数据从最开始循环到末尾,如果末尾的数据不够了,那么从数据的最开始取几条补充上来. 其实,这个功能可以通过JS+PHP实现,也可以通过PHP + MYSQL+JS实现,只不过JS+PHP比较方便而且效率更高罢了. 下面是PHP + MYSQL+JS实现办法. 每次显示10条数据. 1 public function get_data($limit){ 2 $sql="select * from

mysql中约束的添加,修改,与删除

MySQL中的约束,添加约束,删除约束,以及其他的一些修饰:一.NOT NULL(非空约束) 添加非空约束 1)建表时直接添加 CREATE TABLE t_user(user_id INT(10) NOT NULL); 2)通过ALTER 语句 ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL; ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL; 删除非空约束 1)ALTER

Java程序在向mysql中插入数据的时候出现乱码

今天在往数据库中插入数据的时候中文字符在数据库中就出现了乱码?网上有各种说法,但是适合我的,最终解决我的问题的只有下面一种! 在创建数据库的时候,注意设置编码方式. CREATE DATABASE `database` CHARACTER SET 'utf8 ' COLLATE 'utf8_general_ci '; 在建表的时候,注意设置编码方式. CREATE TABLE `table1` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `name` char