使用唯一索引,不存在则插入,存在则更新

INSERT INTO tb_addrbook(num,name,mobile) VALUE('1001','小李','13112345678') ON DUPLICATE KEY UPDATE name= '小李',mobile='13112345678'

但是,大家可能会发现,这个表如果是有设置自增ID的话,这个自增ID并不会按正常的记录增加而加1增长,而是会跳跃增长,增长跨度和SQL的执行次数成正比。当然,自增ID在许多业务中只是作为一个记录唯一性标识而已,跳跃增长影响并不大。不过,我们通过此可以判定,ON DUPLICATE KEY UPDATE 的执行,更新操作也会使自增ID加1。

如果既要使用ON DUPLICATE KEY UPDATE,又要避免自增ID跳跃增长,可以通过修改innodb_autoinc_lock_mode模式的值,innodb_autoinc_lock_mode默认为1,另外还有0和2两种模式。根据网上的说法,0就是所谓的传统模式,这种模式下的自增锁属于表级锁,必须等待当前SQL执行完成后或者回滚掉才会释放,这种模式在高并发的情况下抢锁应该挺严重的。2模式下,是有利于批量插入操作的,例如INSERT INTO … (SELECT …),可以一次性获得大批自增ID,而且不锁整表。这种模式所有的INSERT操作可以立马获得锁并释放。这种不锁表就存在着隐患,就是如果数据表有做主从同步的情况下,同步操作在回放批量插入SQL时,有可能自增ID已经是错乱的了。所以网上的说法是,innodb_autoinc_lock_mode为2的模式下,复制是不安全的。

深入理解和优雅使用ON DUPLICATE KEY Update 解决存在则更新,不存在则新增的问题 先看语法INSERT INTO table(id,a,……) values(1,‘xh’,……) ON DUPLICATE KEY Update a=‘value’,……; 1,先创建表结构如下 DROP TABLE IF EXISTS `t_ware_duplicate`; CREATE TABLE `t_ware_duplicate` ( `id` int(11) NOT NULL AUTO_INCREMENT, `part_no` varchar(100) DEFAU 有业务需求是 如果存在就更新,如果不存在就新增 之前用的 django orm中自带的 update_or_create 发现操作1900条数据的时候将近两分钟,太耗时了,然后翻了翻mysql的书籍,发现了ON DUPLICATE KEY UPDATE 方法 1、该语句是基于唯一索引或主键使用,需要建立unique index 索引 2、更新操作必须是在已有的数据基础上才会被执行,如果要更新的字段是主键或者唯一索引,不能和表中已有的数据重复,否则插入更新都失败。 3、不管是更新还是增加等操作,都不 在对看看的后台进行排序的时候,遇到了一个像这样的需求,在电影表中有ID(主键自增)和orderby(排序字段) ,假设有十条数据id分别从1-10之间,对应的orderby也是从1-10之间,我现在想把id=9的数据移动到第三的位置(id=3)的这个位置,并且保证之前的数据排列顺序(即id=3的orderby=4,id=4的orderby=5…id=8的orderby=9),这样如果用循环的形式是可以解决数据的问题,但是这样操作数据库过程太多,现在就想用一条sql语句来解决这个问题. 下面来看看Mysql的REPLACE和INSERT … ON DUPLICATE KEY UPDATE  首先你的主键必须是int类型的,才能自动增加,如下图 通过T-sql语句如何实现:举个例子比较能说明问题create table testtable(id int  identity primary key,test varchar(25) null) 首先我创建一个表,ID主键,并且设置为自动增加(一般默认为从1开始) 我现在插入几条数据  作为程序员的二狗子今天已经把手下的任务做完了,正在假装认真工作的样子尽情摸鱼,二狗子闲得无聊,坐立不安,坐着不是,站着也不是,浑身难受。 老板:“那个.....二狗子,你过来一趟” 二狗子心想,老司机摸鱼被发现啦?怀着忐忑不安的心情去了老板那里。 老板:“这张表主键ID设置的自动增长为什么会跳跃增长,而且增长的速度非常快,再这样下去迟早有一天会突破Int的最高数值,你赶紧想办法解决一下!”......... 最近项目上需要实现这么一个功能:从服务器数据库获取一个json字符串,通过解析获得一个10万量的数据,存入本本地数据库,最开始采用先更新后新增的逻辑进行操作,通过测试逐条更新执行完,整个代码是在10分钟左右,效率低下,所以采用了如下代码 <insert id="insertPackWmsOperator" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id"> insert into pack_ CREATE TABLE `test_duplicate_key` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', `name` varchar(255) DEFAULT NULL, `age` int(11) , PRIMARY KEY (`id`), UNIQUE KEY `name_idx` (`name`) ) ENGINE=InnoDB; select * from test_duplicate_key 今天做了一个关于排行榜的功能,大概就是对粉丝总数的值进行倒序排序,取粉丝数最多的前一百名,需要返回对应的名次; 这里特殊说明一下,如果粉丝数相同,则按达到条件时间的先后排序,不允许出现名次相同的现象; 我这就直接上代码了啊,逻辑什么的大家自己看看就行,具体的解释 在下面的6个参考中: 下面展示一些 SQL语句。 <select id="rankFansList" resultType="java.util.HashMap"> select @rownum:=@rownum 2017年11月9日MySQL序列使用MySQL序列是一组整数:1,2,3,...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的的序列。使用AUTO_INCREMENTMySQL中最简单使用序列的方法就是使用MySQL AUTO_INCREMENT来定义列。实例以下实例中创建了数据表昆虫,昆虫中无需指定... import MySQLdb conn=MySQLdb.connect(host='127.0.0.1',port=3306,user='root',passwd='251719',db='logdeal',charset='utf8') cur=conn.cursor() cur.execute(""" create table if not EXISTS proxyinfodata Mysql数据库产生序列号通常使用big int类型,并设置AUTO_INCREMENT为true,这样每次insert记录的时候,序列号会自动递增。该方式当insert执行完事务发生回滚时会产生跳号,如果项目有要求,就需要处理。本文讨论自增序列号发生跳号,如何处理。