Mysql如果某个字段值存在则更新另一个字段的值为原值+100,命令应该如何写?

  • 首先设置一个变量,初始值为任意数值,这里以0为例:

    更新xh(序号)这个字段的值。处理如下:

    如需按某种顺序更新,自行排序即可。

    自己最近有用到,记录一下。

  • 以上这篇mysql更新一个表里的字段等于另一个表某字段实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:Sql查询MySql数据库中的表名和描述表中...

  • 最近在工作的时候突然想到了一个问题,就是mysql如何才能实现批量更新多条记录的同一个字段为不同,于是就动手实践起来了,发现其中的学问还是挺多的,所以想着就总结下来分享给大家,需要的朋友们可以参考借鉴...

  • 现在想从这5条记录中查询所有title重复的记录

  • 任务目标: 得出一个学生各科成绩中最大的一个 面腾讯的一道题,当时竟然还犹豫了,还是练得少!!! 创建一个如图所示的表 方法一: 行列进行转换,利用max求解 select name ,max(yuwen) ...(select name,yuwen from ...

  • 是根据数据插入顺序自动+1的,现在我想根据pub_time递增,更新order_id的为递增,什么好办法...

    mysqlsql数据库 现在有一张表,表中已经有4000条数据,其中有一个字段为 order_id,

    更新order_id的值为递增,有什么好办法吗???不是更新新加的数据,是更新表中现有的4000条数据

    mysql库对吧,直接上脚本:

    之前遇到这样的事情我会写一个php脚本去跑这张表:在php程序中做好修改然后再入库(实际上目前我遇到的导数据除了直接从数据源导入到新库中,我直接使用navicat导入导出外其他均使用这种方式跑库,还写不出DBA能写出的复杂sql,用冬哥的话说一步一步来,先最快解决问题再去学习使用新技术)。

    这个问题中我想到了曾经遇到过的mysql函数replace应该能达到目的,先google一下:

    正和我意,我的sql出来了:

    先备份一下该表(使用mysqldump还是navicat或者pma自己选择吧,但是要注意如果库很大还是让运维组的同事在服务器上备份吧尤其是对于已上线的项目,但是一定要先想想备份即使你已开了binlog),复制粘贴一下上边的sql搞定......

  • 这个问题似乎没有什么好的解决方法,个朋友提示,能否将1千万条记录拆分成多个部分,并发更新,这种比单纯的一条SQL全表更新要快一些。真的是这样吗?我做了一个实验。1. 环境配置:机器配置:16核,32GMySQL 版本...

  • find_in_set使用前提是字段是使用英文逗号进行分隔...

  • 在实践中,会出现某些字段中的内容变了,比如三方提供的图标地址变了,那么或许对字段中存储的图片域名进行更新,此时就需要用到mysql更新字段中的部分内容的功能。 基本更新语句如下: update table set icon = ...

  • 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回重复记录的条数,而不是用它来返回重记录的所有。其原因是...

  • bug:在数据库中定义了一个字段,类型为decimal(8,2)(PS:decimal(M,D)M数值的总位数。 通俗点讲,就是看多少个数字,比如,5.6789,M就是5, D:小数点后面能保留几位。 比如上面的5.6789 ,D就是4。 这只是举一个...

将所有数据都存放在内存中,所以它的读写能力也非常高。Redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会丢失。除了这些功能,Redis 还提供了键国企、发布订阅、事务、流水线、Lua 等附加功能。

正常情况下,Redis 执行命令的速度非常快,官方给出的数字是读写性能可以达到 10 万/秒。Redis 速度快的原因主要归纳为几点:① Redis 的所有数据都放在内存中。② Redis 是使用 C 语言实现的,一般来说 C 语言实现的程序距离底层操作系统更近,因此速度相对会更快。③ Redis 使用了单线程架构,预防了多线程的竞争问题。

基于键值对的数据结构服务器

与很多键值对数据库不同的是,Redis 中的值不仅可以是字符串,还可以是具体的数据结构,这样不仅能应用于多种场景开发,也可以提高开发效率。Redis 的全称是 REmote Dictionary Server,它主要提供五种数据结构:字符串、哈希、列表、集合、有序集合,同时在字符串的基础上演变出了位图和 HyperLogLog 两种数据结构,随着 LBS 基于位置服务的发展,Redis


之前的连接方式是直连方式,所谓直连是指 Jedis 每次都会新建 TCP 连接,使用后再断开连接,对于频繁访问 Redis 的场景显然不是高效的使用方式。

生产方式中一般使用连接池的方式对 Jedis 连接进行管理,所有 Jedis 对象预先放在池子中,每次要连接 Redis,只需要在池子中借,用完了再归还给池子。

客户端连接 Redis 使用 TCP 连接,直连的方式每次需要建立 TCP 连接,而连接池的方式是可以预先初始化好的 Jedis 连接,所以每次只需要从 Jedis 连接池借用即可,而借用和归还操作是在本地进行的,只有少量的并发同步开销,远远小于新建 TCP 连接的开销。另外直连的方式无法限制 Jedis 对象的个数,在极端情况下可能会造成连接泄露,而连接池的形式可以有效的保护和控制资源的使用。

简单方便,适用于少量长期连接的场景。 存在每次连接关闭 TCP 连接的开销,资源无法控制可能出现连接泄露,Jedis 对象线程不安全
无需每次连接都生成 Jedis 对象降低开销,使用连接池的形式保护和控制资源的使用 相对于直连比较麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题

使用 Jedis 连接池操作的示例:

// 使用默认连接池配置 // 不是关闭连接,而是归还连接池

Redis 提供了客户端相关 API 对其状态进行监控和管理。

client list 命令能列出与 Redis 服务端相连的所有客户端连接信息,输出的每一行代表一个客户端信息,每行包括了十几个属性,重要的属性解释:

  • id:客户端连接的唯一标识,这个 id 随着 Redis 的连接自增,重启 Redis 后会重置为 0。

  • addr:客户端连接的 ip 和端口。

  • fd:socket 的文件描述符,与 lsof 命令结果中的 fd 是同一个,如果 fd = -1代表当前客户端不是外部客户端,而是 Redis 内部的伪装客户端。

  • name:客户端的名字。

  • Redis 为每个客户端分配了输入缓冲区,它的作用是将客户端发送的命令临时保存,同时 Redis 会从输入缓冲区拉取命令并执行,输入缓冲区为客户端发送命令到 Redis 执行命令提供了缓冲功能。qbuf 和 qbuf-free 分别代表这个缓冲区的总容量和剩余容量,Redis 没有提供相应的配置来规定每个缓冲区的大小,输入缓冲区会根据输入内容的大小的不同动态调整,只是要求每个客户端缓冲区的大小不能超过 1G,超过后客户端将被关闭。

    输入缓冲区使用不当会产生两个问题:

    • 一旦某个客户端的输入缓冲区超过 1G,客户端将被关闭。
    • 输入缓冲区不受 maxmemory 控制,假设一个 Redis 示例设置了该值为 4G,已经存储了 2G,但如果输入缓冲区使用了 3G,可能会产生数据丢失、键值淘汰、OOM 等情况。

    输入缓冲区过大主要是因为 Redis 的处理速度跟不上输入缓冲区的输入速度,并且每次进入输入缓冲区的命令包含了大量 bigkey,从而造成了输入缓冲区过大,还有一种情况就是 Redis 发生了阻塞,短期不能处理命令,造成客户端输入的命令挤压在了缓冲区。

    监控输入缓冲区异常有两种方法:

    • 定期执行 client list 命令,收集 qbuf 和 qbuf-free 找到异常的连接记录并分析,找出可能出问题的客户端。该方法可以精确分析每个客户端定位问题,但执行速度慢。
    • 通过 info 命令的 info clients 模块,找到最大的输入缓冲区,设置报警阈值。该方法执行速度快,但是不能精确定位客户端。
  • Redis 为每个客户端分配了输出缓冲区,它的作用是保存命令执行的结果返回给客户端,为 Redis 和客户端交互返回结果提供缓冲。输出缓冲区按照客户端的不同分为普通客户端、发布订阅客户端、slave 客户端。obl 代表固定缓冲区的长度,oll 代表动态缓冲区列表的长度,omem 代表使用的字节数。


client setName 用于给客户端设置名字,这样比较容易标识出客户端的来源。

client setName 和 client getName 命令可以作为标识客户端来源的一种方式,但是通常来说在 Redis 只有一个应用方使用的情况下,IP 和端口作为表示会更加清晰。当多个应用共同使用一个 Redis,那么此时 client setName 可以作为标识客户端的一个依据。


此命令用于杀掉指定 IP 地址和端口号的客户端,由于一些原因需要手动杀掉客户端连接时,可以使用该命令。


该命令用于阻塞客户端,timeout 是阻塞时间,单位为毫秒,在此期间客户端连接将被阻塞。

  • client pause 只对普通和发布订阅客户端有效,对于主从复制无效,因此可以让主从复制保持一致。
  • 可以用一种可控的方式将客户端连接从一个 Redis 节点切换到另一个 Redis 节点。

monitor 命令用于监控 Redis 正在执行的命令。但是一旦并发量过大,monitor 客户端的输出缓冲会暴涨,可能瞬间会占用大量内存。


timeout:检测客户端空闲连接的超时时间,一旦空闲时间到了 timeout,客户端将被关闭,如果设置为 0 就不进行检测。

maxclients:客户端最大连接数,这个参数会受到操作系统的限制。

tcp-alive:检测 TCP 连接活性的周期,默认值为 0,也就是不进行检测。如果需要设置,建议为 60,Redis 每隔一分钟会对它创建的 TCP 连接进行活性检测,防止大量死连接占用系统资源。

tcp-backlog:TCP 三次握手后,会将接受的连接放入队列中,tcp-backlog 就是队列的大小,默认值是 511,通常来说这个参数不需要调整。


JedisPool 中的 Jedis 对象个数是有限的,默认是 8 个。如果对象全部被占用并且没有归还,调用者借用 Jedis 时就会阻塞等待,如果超过了最大等待时间 maxWaitMills 就会抛出异常。

还有一种情况就是设置了 blockWhenExhausted = false,那么调用者发现池子中没有资源时会立即抛出异常而不进行等待。

  • 客户端:高并发情况下连接池设置过小,供不应求,但正常情况下只需要比默认的 8 个大一点即可。
  • 客户端:没有正确使用连接池,例如没有释放。
  • 客户端:存在慢查询操作,这些慢查询持有的 Jedis 对象归还速度会比较慢。
  • 服务端:客户端正常,服务端由于一些原因造成了客户端命令执行过程的阻塞。

Jedis 在调用 Redis 时,如果出现了读写超时,会抛出异常,造成该异常的原因:

  • 读写超时时间设置得过短。
  • 客户端与服务端网络不正常。
  • Redis 自身发生了阻塞。

Jedis 在调用 Redis 时,如果出现了连接超时,会抛出异常,造成该异常的原因:

  • 连接超时时间设置得过短。
  • 客户端与服务端网络不正常。

Jedis 在调用 Redis 时,如果出现了客户端数据流异常,会抛出异常,造成该异常的原因:

  • 长时间闲置连接被服务端主动断开。
  • 不正常并发读写:Jedis 对象同时被多个线程并发操作,可能会出现该问题。

Jedis 调用 Redis 时,如果 Redis 正在加载持久化文件,那么会抛出异常。

Jedis 执行写操作时,如果 Redis 的使用内存大于 maxmemor 的设置,会抛出异常。

如果客户端连接数超过了 maxclients,新申请的连接会抛出异常。此时新的客户端连接执行任何命令都会返回错误结果。

  • 客户端:如果 maxclients 参数不是很小的化,应用方的客户端连接数基本不会超过 maxclients,通常来看是由于应用方对于 Redis 客户端使用不当造成的。此时如果应用方是分布式结构的话,可以通过下线部分应用节点使得 Redis 的连接数先降下来。从而让绝大部分节点可以正常允许,再通过查找程序 bug 或调整 maxclients 进行问题的修复。
  • 服务端:如果客户端无法处理,而当前 Redis 为高可用模式,可以考虑做故障转移。

服务端:Redis 主节点内存陡增,几乎用满 maxmemory,而从节点内存并没有变化。

客户端:客户端产生了 OOM 异常,也就是 Redis 主节点使用的内存已经超过了 maxmemory 的设置,无法写入新的数据。

① 确实有大量写入,但是主从复制出现问题。

② 如果主从复制正常,可以排查十分由客户端缓冲区造成主节点内存陡增,使用 info clinets 查询相关信息。如果客户端缓冲队列值很大,通过 client list 命令找到 omem 不正常的连接,一般来说为 0,因此不为 0 就是不正常的连接。有可能是因为客户端执行 monitor 造成的。

使用 client kil 杀掉这个连接,让其他客户端恢复正常即可。需要注意的有三点:

  • 禁止开发人员在生产中使用 monitor。
  • 限制输出缓冲区的大小。

客户端:客户端出现大量超时,并且是周期性的。

服务端:没有明显的异常,只是有一些慢查询操作。

① 网络:服务端和客户端之间的网络出现周期性问题,网络正常。

② Redis 本身:观察 Redis 的日志统计,无异常。

③ 客户端:发现只要慢查询出现,就会连接超时,因此是慢查询导致了连接超时。

  • 从运维层面,监控慢查询,超过阈值就发出警报。
  • 从开发层面,避免不正确的使用。

RESP 保证了客户端与服务端的正常通信,是各种编程语言开发客户端的基础。

要选择社区活跃客户端,在实际项目中使用稳定版本的客户端。

区分 Jedis 直连和连接池的区别,在生产环境应该使用连接池。

Jedis.close() 在直连下是关闭连接,在连接池则是归还连接。

客户端输入缓冲区不能配置,强制限制在 1G 以内,但是不会受到 maxmemory 限制。

客户端输出缓冲区支持普通客户端、发布订阅客户端、复制客户端配置,但不会受到 maxmemory 限制。

Redis 的 timeout 配置可以自动关闭闲置客户端,tcp-alive 参数可以周期性检查关闭无效 TCP 连接。

monitor 命令虽然好用,但是在高并发下存在输出缓冲区暴涨的可能性。

info clients 帮助开发和运维找到客户端可能存在的问题。


mysql 数据库,更新字段语句:

UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。

如下面的语句将users表中id等于123的记录的age改为24。

上面的UPDATE语句通过WHERE指定一个条件,否则,UPDATE将更新表中的所有记录的值。

在使用UPDATE更新记录时,如果被更新的字段的类型和所赋的值不匹配时,MySQL将这个值转换为相应类型的值。如果这个字段是数值类型,而且所赋值超过了这个数据类型的最大范围,那么MySQL就将这个值转换为这个范围最大或最小值。如果字符串太长,MySQL就将多余的字符串截去。如果设置非空字段为空,那么将这个字段设置为默认值,数字的默认值是0,字符串的默认值是空串(不是null,是"")。

有两种情况UPDATE不会对影响表中的数据:

1. 当WHERE中的条件在表中没有记录和它匹配时。

2. 将同样的值赋给某个字段时,如将字段abc赋为'123',而abc的原值就是'123'。和INSERT、REPLACE一样,UPDATE也返回所更新的记录数。但这些记录数并不包括满足WHERE条件的,但却未被更新的记录。如下同的UPDATE语句就未更新任何记录。

注意:如果一个字段的类型是TIMESTAMP,这个字段在其它字段更新时自动更新。

在有些时候需要得到UPDATE所选择的行数,而不是被更新的行数。可通过一些API来达到。如MySQL提供的C API提供了一个选项可以得到想要的记录数。而MySQL的JDBC驱动得到的默认记录数也是匹配的记录数。

UPDATE和REPLACE基本类似,但是之间有两点不同。

1. UPDATE在没有匹配记录时什么都不做,而REPLACE在有重复记录时更新,在没有重复记录时插入。

2. UPDATE可以选择性地更新记录的一部分字段。而REPLACE在发现有重复记录时就将这条记录彻底删除,再插入新的记录。也就是说,将所有的字段都更新了。

在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句。DELETE语句可以通过WHERE对要删除的记录进行选择。而使用TRUNCATE TABLE将删除表中的所有记录。因此,DELETE语句更灵活。

如果要清空表中的所有记录,可以使用下面的两种方法:

其中第二条记录中的TABLE是可选的。

如果要删除表中的部分记录,只能使用DELETE语句。

如一个表中有自增字段,使用TRUNCATE TABLE和没有WHERE子句的DELETE删除所有记录后,这个自增字段将起始值恢复成功。如不想这样做的话,可在DELETE语句中加上WHERE,如WHERE 1或WHERE true。

上面的语句在执行时将扫描每一条记录。并不比较,这个WHERE条件永远为true。这样做可保持自增的最大值,由于扫描了所有的记录,执行成本要比没有WHERE子句的DELETE大得多。

DELETE和TRUNCATE TABLE的区别:DELETE可以通过WHERE语句选择要删除的记录。但执行得速度不快。且还可返回被删除的记录数。而TRUNCATE TABLE无法删除指定的记录,且不能返回被删除的记录。但执行得非常快。和标准的SQL语句不同,DELETE支持ORDER BY和LIMIT子句,通过这两个子句,可更好地控制要删除的记录。如当我们只想删除WHERE子句过滤出来的记录的一部分,可以使用LIMIB,如果要删除后几条记录,可通过ORDER BY和LIMIT配合使用。假设要删除users表中name等于"Mike"的前6条记录。可使用如下的DELETE语句:

一般MySQL并不确定删除的这6条记录是哪6条,为保险,可使用ORDER BY对记录进行排序。

我要回帖

更多关于 update语句更新条件中的字段 的文章

 

随机推荐