mysql update改动多条数据

通常情况下,我们会使用下面SQL语句来更新字段值:

复制代码代码例如以下:

UPDATE mytable SET myfield=‘value‘ WHERE other_field=‘other_value‘;

可是,假设你想更新多行数据,而且每行记录的各字段值都是各不一样,你会怎么办呢?举个样例,我的博客有三个分类文件夹(免费资源、教程指南、橱窗展示),这些分类文件夹的信息存储在数据库表categories中,而且设置了显示顺序字段
display_order,每一个分类占一行记录。假设我想又一次编排这些分类文件夹的顺序,比如改成(教程指南、橱窗展示、免费资源),这时就须要更新categories表对应行的display_order字段,这就涉及到更新多行记录的问题了,刚開始你可能会想到使用循环运行多条UPDATE语句的方式,就像下面的php程序演示样例:

复制代码代码例如以下:

foreach ($display_order as $id => $ordinal) {

$sql="UPDATE categories SET display_order = $ordinal WHERE id = $id";

mysql_query($sql);

}

这样的方法并没有什么不论什么错误,而且代码简单易懂,可是在循环语句中运行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的降低数据库查询的次数,以降低资源占用,同一时候能够提高系统速度。

幸运的是,还有更好的解决方式,以下列举两种经常使用的方案仅仅只是SQL语句略微复杂点,可是仅仅需运行一次查询就可以,语法例如以下:

?第一种:IF--THEN语句结合

复制代码代码例如以下:

UPDATE mytable

SET myfield = CASE other_field

WHEN 1 THEN ‘value‘

WHEN 2 THEN ‘value‘

WHEN 3 THEN ‘value‘

END

WHERE id IN (1,2,3)

回到我们刚才的分类文件夹的样例,我们能够使用下面SQL语句:

复制代码代码例如以下:

UPDATE categories

SET display_order = CASE id

WHEN 1 THEN 3

WHEN 2 THEN 4

WHEN 3 THEN 5

END,

title = CASE id

WHEN 1 THEN ‘New Title 1‘

WHEN 2 THEN ‘New Title 2‘

WHEN 3 THEN ‘New Title 3‘

END

WHERE id IN (1,2,3)

以上方案大大降低了数据库的查询操作次数,大大节约了系统资源,可是该如何与我们的编程语言结合起来呢?我们还是用刚才分类文件夹的样例,下面是php的程序演示样例:

复制代码代码例如以下:

$display_order = array(

1 => 4,

2 => 1,

3 => 2,

4 => 3,

5 => 9,

6 => 5,

7 => 8,

8 => 9

);

$ids = implode(‘,‘, array_keys($display_order));

$sql = "UPDATE categories SET display_order = CASE id ";

foreach ($display_order as $id => $ordinal) {

$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); // 拼接SQL语句

}

$sql .= "END WHERE id IN ($ids)";

echo $sql;

mysql_query($sql);

在这个样例中总共更新了8行数据,可是仅仅运行了一次数据库查询,相比于循环运行8次UPDATE语句,以上样例所节约的时间能够说是微不足道的。可是想想,当你须要更新10,0000或者很多其它行记录时,你会发现这当中的优点!唯一要注意的问题是SQL语句的长度,须要考虑程序运行环境所支持的字符串长度,我眼下获得的数据:SQL语句长度达到1,000,960在php中仍然能够顺利运行,我查询了php文档并没有发现明白规定字符串最大长度。

?另外一种INSERT方式

MySql中INSERT语法具有一个条件DUPLICATE KEY UPDATE,这个语法和适合用在须要推断记录是否存在,不存在则插入存在则更新的记录。

基于上面这样的情况,针对更新记录,仍然使用insert语句,只是限制主键反复时,更新字段。例如以下:

复制代码代码例如以下:

INSERT INTO t_member (id, name, email) VALUES

(1, ‘nick‘, ‘[email protected]‘),

(4, ‘angel‘,‘[email protected]‘),

(7, ‘brank‘,‘[email protected]‘)

ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email);

注意:ON DUPLICATE KEY UPDATE仅仅是MySQL的特有语法,并非SQL标准语法!

时间: 2024-10-15 00:56:18

mysql update改动多条数据的相关文章

mysql update修改多条数据

通常情况下,我们会使用以下SQL语句来更新字段值: 复制代码代码如下: UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源.教程指南.橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录.如果我想重新编排这些

Java 线程池 +生产者消费者+MySQL读取300 万条数据

1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解决办法 多线程读取, 生产者 每次获取200 条数据, 消费者去消费.(这里 主要是根据MySQL分页去获取下一个200 条数据) 1.4 代码 1.4.1 调用方法 /** * 线程启动 */ public void update() { //redis操作类 HashRedisUtil redi

mysql批量插入500条数据

表格结构如下 需求name和password字段,生成如下格式: 总共批量生成500个. 解决思路: 可以用mysql 存储过程 如果linux环境下可以用shell 我们先测试第一种,用存储过程. DELIMITER ;;      ##定义;;为结束符 CREATE PROCEDURE test_insert()    ##创建存储过程  test_insert()是名字 BEGIN  DECLARE y int DEFAULT 1 ;        ##定义y 为整数 默认起始值为1 WH

用一句mysql语句插入多条数据

假如有一个数据表A: id name title addtime 如果需要插入n条数据 : $time= time(); $data = array(    array(      'name'=>'name1','title'=>'title1','addtime'=>$time;    ),    array(      'name'=>'name2','title'=>'title2','addtime'=>$time;    ),    array(      

mysql随机取出n条数据

SELECT * FROM  tableName  ORDER BY  RAND() LIMIT n      数据量小的话还可以, 数据量大起来了, 就影响性能了. 根据表中的ID, 假设表中有1000条数据,那么先生成1-1000的随机数,比如放进数组中,然后遍历,然后where id = randnum,循环查询n次.想不到别的办法了. 原文地址:https://www.cnblogs.com/bneglect/p/11324208.html

python连接mysql循环插入千万条数据脚本

之前都是在mysql的存储过程中插入数据,毕竟mysql语法函数有限,很多都有限制.突然想到学了python正好可以练练手. 首先需要安装pymysql模块包(模块包安装请自行百度) 1 #encoding:utf-8 2 import pymysql 3 import time 4 import random 5 #连接mysql 6 db = pymysql.connect('14.29.249.74','kx_admin','Yjh7yC0L7L1G1k6qXKwb','ilock') 7

如何在mysql数据库生成百万条数据来测试页面加载速度

1.首先复制一条sql 在复制前,需要确定该记录是否有主键 若无,则代码非常简单, insert into gl_energy_meter_data SELECT * from gl_energy_meter_data where dosage="12432"; 复制的表名↑                                              粘贴的表名↑                        ↑ 某个字段的值最好唯一 若有主键,一般是ID,则需要随机生成

mysql 查询前几条数据

limit是mysql的语法select * from table limit m,n其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条.select * from tablename limit 2,4即取出第3条至第6条,4条记录 原文地址:https://www.cnblogs.com/liangliping/p/10193745.html

MySQL取上一条数据的某个字段值

SELECT @lagfield ,@lagfiled := targField, t.*FROM TABLE t, (SELECT @lagfield := '') r其中targField是你想要在下一行呈现的字段,根据字段是字符还是数字,最后的select 应该不同,如果是数字,则应该(select @lagfield:=0) r 创建自定义函数 CREATE FUNCTION lag(col_name VARCHAR(255))RETURNS VARCHAR(255) BEGIN DEC