首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql技巧:如果记录存在更新如果不存在插入的三种处理方法

先建一个表,便于后面讨论: CREATE TABLE `t_emp` ( `f_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `f_emp_code...要求: 新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。...这个方法有一个很大的问题,如果记录存在,每次执行完,主键自增id就变了(相当于重新insert了一条),对于有复杂关联的业务场景,如果主表的id变了,其它子表没做好同步,会死得很难看。...该方法,没有replace into的副作用,不会导致已存在记录的自增id变化。...但是有另外一个问题,如果这个表上有不止一个唯一约束,在特定版本的mysql中容易产生dead lock(死锁),见网友文章https://blog.csdn.net/pml18710973036/article

7.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

如果MySQL的自增 ID 用完了,怎么办?

作者 | 方志朋 来源 | https://mp.weixin.qq.com/s/Yqo5PaTtQcQTn4p8BE6SGg 如果你用过或了解过MySQL,那你一定知道自增主键了。...如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/ Xid MySQL中redo...它在 MySQL 中是用来对应事务的。 MySQL 内部维护了一个全局变量 global_query_id,每次执行语句的时候将它赋值给 Query_id,然后给这个变量加 1。...如果当前语句是这个事务执行的第一条语句,那么 MySQL 还会同时把 Query_id 赋值给这个事务的 Xid。而 global_query_id 是一个纯内存变量,重启之后就清零了。...但是这个过程有脏读存在,那么这个id就不会是原子性的,存在重复的可能性。 thread_id 其实,线程 id 才是 MySQL 中最常见的一种自增 id

1.2K20

如果MySQL的自增 ID 用完了,该怎么办?

如果你用过或了解过MySQL,那你一定知道自增主键了。每个自增id都是定义了初始值,然后按照指定步长增长(默认步长是1)。...InnoDB系统自增row_id 如果你创建的 InnoDB 表没有指定主键,那么 InnoDB 会给你创建一个不可见的,长度为 6 个字节的 row_id。...MySQL 内部维护了一个全局变量 global_query_id,每次执行语句的时候将它赋值给 Query_id,然后给这个变量加 1。...如果当前语句是这个事务执行的第一条语句,那么 MySQL 还会同时把 Query_id 赋值给这个事务的 Xid。而 global_query_id 是一个纯内存变量,重启之后就清零了。...但是这个过程有脏读存在,那么这个id就不会是原子性的,存在重复的可能性。 thread_id 其实,线程 id 才是 MySQL 中最常见的一种自增 id

75620

性能大PK count(*)、count(1)和count(列)

印象中网上有些“XX 面试官”系列的网文也有过类似问题的讨论,那 MySQL计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。...count(主键id) InnoDB引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为的,就按行累加。...这里的不是只空字符串或者0,而是表示null 的计数,即某个字段值为null 时,不统计。...执行效率上: 列名为主键, count(列名) 会比 count(1)快 列名不为主键, count(1) 会比 count(列名)快 如果表多个列并且没有主键, count(1) 的执行效率优于 count...(*) 如果有主键, select count(主键) 的执行效率是最优的 如果表只有一个字段, select count(*)最优。

1.4K10

MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?「建议收藏」

所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为的,就按行累加。...看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...其实,把计数放在Redis里面,不能够保证计数MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。...而把计数值也放在MySQL中,就解决了一致性视图的问题。 InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。

1.5K40

MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为的,就按行累加。...看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...其实,把计数放在Redis里面,不能够保证计数MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。...而把计数值也放在MySQL中,就解决了一致性视图的问题。 InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。

4.7K50

count(*)、count(主键id)、count(字段)和count(1)等不同用法的性能,有哪些差别?那种效率更高

所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为的,就按行累加。...看到这里,你一定会说,优化器就不能自己判断一下吗,主键id肯定非啊,为什么不能按照count(*)来处理,多么简单的优化啊。 当然,MySQL专门针对这个语句进行优化,也不是不可以。...小结 今天,我和你聊了聊MySQL中获得表行数的两种方法。我们提到了在不同引擎中count(*)的实现方式是不一样的,也分析了用缓存系统来存储计数值存在的问题。...其实,把计数放在Redis里面,不能够保证计数MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。

53120

案例解析:count(1)、count(*) 与 count(列名) 的执行区别

而count(字段)与前两者不同,它会统计该字段不为null的记录条数。 话不多说了,来一起看看详细的介绍吧。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(),自动会优化指定到那一个字段。...这里的不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...执行效率上 列名为主键,count(列名)会比count(1)快 列名不为主键,count(1)会比count(列名)快 如果表多个列并且没有主键, count(1) 的执行效率优于 count(*)...如果有主键, select count(主键)的执行效率是最优的 如果表只有一个字段, select count(*)最优 mysql> create table counttest(name char

1.2K10

MySQL数据库进阶-SQL优化

order by字段全部使用升序排序或者降序排序,都会走索引,但是如果一个字段升序排序,另一个字段降序排序,则不会走索引,explain的extra信息显示的是Using index, Using filesort...,如果要优化掉Using filesort,则需要另外再创建一个索引,如: 此时使用如下sql会全部走索引 select id, age, phone from tb_user order by age...优化方案:自己计数,如创建key-value表存储在内存或硬盘,或者是用redis count的几种用法: 如果count函数的参数(count里面写的那个字段)不是NULL(字段值不为NULL),累计值就加一...,最后返回累计值 用法:count(*)、count(主键)、count(字段)、count(1) count(主键)跟count(*)一样,因为主键不能为; count(字段)只计算字段值不为...,服务层判断是否为null,不为null,计数累加;有not null约束的话,InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加 count(1):InnoDB

13510

MySQL关于Count你知道多少

前言大家好,我是小郭,MySQL关于Count你知道多少统计数据的需求在我们日常开发中是非常容易遇到了,MySQL也支持多种的计算的函数,接下来我们来看一看他们之间有什么区别,以及他们是否存在一些坑。...count(*)、count(1)、count(id)的区别count的含义:count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,...count(字段)比较特殊,表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数分析性能差别原则server 层要什么就给什么;InnoDB 只给必要的值;现在的优化器只优化了 count...server 层拿到 id 后,判断是不可能为的,就按行累加。count(1) 来说,InnoDB 引擎遍历整张表,但不取值。...server 层对于返回的每一行,放一个数字“1”进去,判断是不可能为的,按行累加。count(字段),server要字段,就返回字段,如果字段为,就不做统计,字段的值过大,都会造成效率低下。

47010

MYSQL 下 count(*)、count(列)、 count(1) 理解

在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为(...这里的不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...执行效率上: 列名为主键,count(列名)会比count(1)快 (待商榷) 列名不为主键,count(1)会比count(列名)快 (确定) 如果表多个列并且没有主键, count(1) 的执行效率优于...count(*) (待商榷) 如果有主键, select count(主键)的执行效率是最优的 (待商榷) 如果表只有一个字段, select count(*)最优。...对于MyISAM表,如果SELECT从一个表中检索,没有检索其他列,也没有WHERE子句,那么COUNT(*)被优化为快速返回。

2.5K41

你还在认为 count(1) 比 count(*) 效率高?

如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(),自动会优化指定到那一个字段。...在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为(...这里的不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...执行效率上: 列名为主键,count(列名)会比count(1)快 列名不为主键,count(1)会比count(列名)快 如果表多个列并且没有主键, count(1) 的执行效率优于 count(*...) 如果有主键, select count(主键)的执行效率是最优的 如果表只有一个字段, select count(*)最优。

63820

一文搞清楚 MySQL count(*)、count(1)、count(col) 的区别

在工作中遇到count(*)、count(1)、count(col) ,可能会让你分不清楚,都是计数,干嘛这么搞这么多东西。...测试 MySQL版本:5.7.29 创建一张用户表,并插入一百万条数据,其中gender字段有五十万行是为null值的 CREATE TABLE `users` ( `Id` bigint(20)...如果二级索引不存在,扫描聚集索引。大概意思就是有二级索引的情况下就使用二级索引,如果有多个二级索引优先选择最小的那个二级索引来降低成本,没有二级索引使用聚集索引。 下面通过测试来验证这些观点。...对于MyISAM表, 如果从一个表中检索,没有检索到其他列并且没有 子句,COUNT(*)优化为非常快速地返回,此优化仅适用于MyISAM 表,因为为此存储引擎存储了准确的行数,并且可以非常快速地访问...总结 count(*)、count(1)、count(id):返回查询的记录总数,无论字段是否包含值,且count(*)和count(1)效率是一样的,没差别,通过上面的执行计划可以推断count(id

1.2K10

你还在认为 count(1) 比 count(*) 效率高?

如果count(1)是聚索引,id,那肯定是count(1)快,但是差的很小的。 因为count(),自动会优化指定到那一个字段。...count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为(这里的不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...列名不为主键,count(1)会比count(列名)快。 如果表多个列并且没有主键, count(1) 的执行效率优于 count(*)。...如果有主键, select count(主键)的执行效率是最优的。 如果表只有一个字段, select count(*)最优。 4....实例分析 mysql> create table counttest(name char(1), age char(2)); Query OK, 0 rows affected (0.03 sec)

33920

你还在认为 count(1) 比 count(*) 效率高?

如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(),自动会优化指定到那一个字段。...在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为(...这里的不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...执行效率上: 列名为主键,count(列名)会比count(1)快 列名不为主键,count(1)会比count(列名)快 如果表多个列并且没有主键, count(1) 的执行效率优于 count(*...) 如果有主键, select count(主键)的执行效率是最优的 如果表只有一个字段, select count(*)最优。

34320

好问题:count(1)、count(*)、count(列)有什么区别?

如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(*),自动会优化指定到那一个字段。...在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为(...这里的不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...执行效率上: 列名为主键,count(列名)会比count(1)快 列名不为主键,count(1)会比count(列名)快 如果表多个列并且没有主键, count(1) 的执行效率优于 count...(*) 如果有主键, select count(主键)的执行效率是最优的 如果表只有一个字段, select count(*)最优。

59910

count(1)、count(*) 与 count (列名) 的执行区别

如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(*),自动会优化指定到那一个字段。...在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为(...这里的不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。...执行效率上: 列名为主键,count(列名)会比count(1)快 列名不为主键,count(1)会比count(列名)快 如果表多个列并且没有主键, count(1) 的执行效率优于 count...(*) 如果有主键, select count(主键)的执行效率是最优的 如果表只有一个字段, select count(*)最优。

3K10
领券