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

MySQL避免插入重复记录的方法

mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。...,新增了一条id=4,c1=3的记录. replace into语句执行完会返回一个数,来指示受影响的行的数目。...使用insert into,你必须具有insert和update权限 如果有新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2;如果记录被更新前后值是一样的,则受影响行数的值显示...replace into和insert ... on duplicate key update,都是替换原有的重复数据,区别在于replace into是删除原有的行后,在插入新行,如有自增id,这个会造成自增...id的改变;insert ... on duplicate key update在遇到重复行时,会直接更新原有的行,具体更新哪些字段怎么更新,取决于update后的语句。

2.3K51
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    当 MySQL 连接池遇上事务(二):消失的记录

    奇怪的是,使用resty.http时错误必现,而恢复luasocket后则不会发生!! 2.3 消失的记录 为了定位,在平台接口内加了很多日志。...我把这叫做“消失的记录”。 3. 事物是普遍联系滴 奇怪的事情屡次发生,我又开始了艰辛的探索之路。这一次,我需要把两个看起来不相关的东西(HTTP调用方式和MySQL)联系起来。...源码并不复杂,确认了只有MySQL APi返回正常时,resty.mysql库才会返回正常。MySQL API我还是信得过的,嘿嘿嘿。 也就是说,记录确实是插入成功了!...而在平台接口sleep之后,因为该连接超过了keepalive时间已经被释放,事务没有被提交,再次获取连接查询时,就查不到刚才插入的记录了,从而造成“消失的记录”。...这次不会出现消失的记录,异步任务记录插入成功,但是由于该连接已开启了事务,会导致任务表被加上行锁和间隙锁,从而导致任务处理svr等锁而无法处理任务,任务最终还是会超时失败。 4.

    4.1K73

    MySQL 核心模块揭秘 | 47 期 | 插入记录的 Undo 日志

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....Insert Undo 日志格式 插入一条记录到表中,首先会插入记录到主键索引,然后遍历二级索引,把记录插入到各个二级索引中。 插入记录到主键索引之前,会生成 Undo 日志,并写入 Undo 页。...插入记录到二级索引,不会生成 Undo 日志。插入记录的 Undo 日志格式比较简单,如下图所示。...table_id,64 位整数,压缩之后占用 1 ~ 11 字节,这个属性值是表 ID,表示事务插入记录到哪个表产生的这条 Undo 日志。...如果主键是由多个字段组成的联合主键,插入记录产生的 Undo 日志中,会按照联合主键定义的字段顺序写入所有主键字段的长度和值:len_1、value_1、len_2、value_2、...

    6810

    MySQL 批量插入记录报 Error 1390 (HY000)

    1.背景 Golang 后台服务使用 GORM 实现与 MySQL 的交互,在实现一个通过 Excel 导入数据的接口时,使用 Save 方法一次性插入大量记录(>1w)时报了如下错误: Error 1390...该错误属于 MySQL 服务端错误,可惜的是,官方文档并未给出详细的错误原因,只给出了错误码的简短描述。错误描述字面意思是“预处理语句包含太多占位符”,结合业务场景,猜测原因是一次插入太多记录。...3.分批插入 既然不允许一次插入太多记录,那么可以改为分批插入,而不是一次性插入所有数据。 // 待插入的记录。...不知道你有没有疑问,我这里分批插入每批记录数是 1000,那可以采用 2000 或者其他数量吗?每批插入记录数的上限是多少呢? 带着这个疑问,请继续往下看。 4.一次最多能插入多少条记录?...MySQL 服务端之所以报 Error 1390 (HY000) 错误,直接原因是一次插入过多的记录,但更深层次的原因是 MySQL SQL 语句的占位符数量有上限,最大值为 16bits 无符号整数的最大值

    95710

    技术分享 | MySQL 创建表后神秘消失?揭秘零宽字符陷阱

    1引言 在 MySQL 的使用过程中,有时候一个小小的字符也能带来大麻烦,在未发现真相时,以为这问题是见了鬼了,而发现真相时,却没想到是一个字符带来的问题,零宽字符像个幽灵隐藏在 IT 行业的各个方面,...今天分享一个关于 MySQL 中“消失的表”的复现案例。...'test.lang' doesn't exist 表就这么神奇的消失了。...经过多次测试发现,在 MySQL 客户端上执行了 SHOW TABLES; 命令时,含有零宽空格的表名后面的边框线 “|” 与其他行是不对齐的。这可以快速发现问题表,但并不显示具体字符。...6总结 零宽字符是一个隐形的陷阱,可能在 MySQL 的使用过程中引发一些看似无解的问题。

    21010

    MySQL获取分组后的TOP 1和TOP N记录

    有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,在一些别的数据库可能有窗口函数可以方面的查出来,但是MySQL没有这些函数,没有直接的方法可以查出来,可通过以下的方法来查询...PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)  插入数据...李四 | 英语 | 50 | | 9 | 王五 | 英语 | 89 | +----+--------+--------+-------+ TOP 1 查询每门课程分数最高的学生以及成绩...| | 张三 | 英语 | 90 | +--------+--------+-------+ 3 rows in set (0.00 sec) TOP N N>=1 查询每门课程前两名的学生以及成绩...1、使用union all 如果结果集比较小,可以用程序查询单个分组结果后拼凑,也可以使用union all root:test> (select name,course,score from test1

    2.9K41

    mysql中一条insert语句批量插入多条记录

    但是这样一来,就会增加服务器的负荷,因为,执行每一次SQL服务器都要同样对SQL进行分析、优化等操作。幸好MySQL提供了另一种解决方案,就是使用一条INSERT语句来插入多条记录。...这并不是标准的SQL语法,因此只能在MySQL中使用。...一条INSERT语句插入批量数据的写法: INSERT INTO [表名]([列名],[列名]) VALUES ([列值],[列值])), ([列值],[列值])), ([列值],[列值...])); 可以看到,和原来的常规INSERT语句的区别,仅仅是在VALUES 后面增加值的排列,每条记录之间用英文输入法状态下的逗号隔开,是不是so easy。...建议: 在程序中,插入批量数据时,最好使用这种通过一条INSERT语句来一次性插入的方式。这样可以避免程序和数据库建立多次连接,从而增加服务器负荷。

    5.5K20

    MYSQL 大量插入数据失败后,磁盘空间却被占用

    最近有人问,在MYSQL中大量插入数据失败后,磁盘空间被占用了不少,然后磁盘空间到底怎么样, 我们先模拟一下这个环节. 先找一个大表,或者现生成一个 #!...的页面定义, 以及图形化后的页面形式....通过上面的信息我们大致知道 这个48MB的磁盘空间里面的数据,共占用了 3072 PAGES ,B-tree node 使用了 2461 , 估计熟悉MYSQL的小伙伴们,头脑里面已经有了那个 树形的图...下面我们来进行这个测试 我们让数据插入,人为的失败.在看磁盘空间的占用方式,的确,数据插入成功和失败占用的磁盘空间并没有差. 由于计算方式,上图给出的datafree 并不准....我们在证明一下到底实际占用的空间是多少,在操作完 OPTIMIZE TABLE test_1; 后 页面重新分配

    1.3K10

    插入有序的单链表(要求插入后元素有序排列)

    分析 这和插入排序的思想有点类似,我们直接在每次插入的时候都按照主关键字(即价格price)的顺序插,这样每次插入后都是有序的。...p = p->next; } } //走到这里说明,表中没有比要插入的price还要大的结点 //直接接在链表表尾就行 r = (SLNode)malloc(sizeof(struct...p = p->next; } } //走到这里说明,表中没有比要插入的price还要大的结点 //直接接在链表表尾就行 r = (SLNode)malloc(sizeof(struct...10个结点,第二次还是插入价格为10的结点,但由于链表已经有price=10的结点了,直接给那个结点的数量增加count就行(题目要求)。...注意圈起来两处的数量 PS: 我竟然改bug改了好久,最后才发现自己竟然卡在了一个逻辑问题上,唉,最近这状态下滑,插入排序都能卡住,醉了,但是改好之后是真的舒服。

    65420

    记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?

    当商品配送完后之后,需要记录它的最新配送价,若商品最新配送价已经存在则进行更新,不存在则执行插入   针对这个需求,我们有哪些实现方式?...INTO   当数据库是 MySQL ,碰到 不存在则插入,存在则更新 的需求时,第一时间往往想到的是 REPLACE INTO   工作原理 replace into 跟 insert 功能类似...) 已经存在,那么先删除此记录,然后插入 (1001,10001,20.5,1,1)   而 (1001,10002,5.45,1,1) 判定为不存在,那么直接插入   这就导致我们看到的输出结果是:...的下一个非手工指定的主键都是 11( AUTO_INCREMENT=11 ),两者是一致的     我们在 master 上使用 replace into 更新一条记录 master 与 slave...,但它是 MySQL 的拓展实现,只有 MySQL 支持,可移植性差   2、针对 INSERT UPDATE 的 “坑”,我们可以结合具体的业务来设置 innodb_autoinc_lock_mode

    2.2K10
    领券