首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL大容量插入忽略

问MySQL大容量插入忽略
EN

Stack Overflow用户
提问于 2016-08-18 11:52:40
回答 2查看 2K关注 0票数 0

我有几个关于MySQL虚张声势插入忽略语句的问题,包括InnoDB和MyISAM.An示例:

代码语言:javascript
复制
INSERT IGNORE INTO table(`reference`) VALUES ('1','2','3')

引用也是唯一的键。

  1. 批量插入是原子的吗?因此,如果我将它发送到数据库,可以确保在此语句之间没有发生其他插入吗?
  2. 批处理插入返回该批处理插入的第一个ID的值。但是,如果第一个插入恰好是一个重复(我是得到一个0作为返回值,还是下一个是(成功返回的插入,我在文档中找不到),会发生什么?

致以亲切的问候,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-18 17:35:23

这里发生了很多事情..。

  • 语法错误:您有1列,但有3个值。也许你是说这个?... VALUES (1), (2), (3)。
  • 在修复之后,您的one语句实质上相当于封装在事务中的三个1行INSERT IGNOREs (如果使用InnoDB)。
  • 由于IGNORE,任何重复的键都不会中止插入。
  • 变量innodb_autoinc_lock_mode控制AUTO_INCREMENT在多行INSERT期间发生的情况。需要知道它的价值才能完全回答这个问题。默认情况下,无论有多少AUTO_INCREMENT id值是重复的,reference值都会增加3。这导致了ids的意外“燃烧”。(并消除了您关于“第一个ID”是什么的问题。)
  • 在非事务性引擎(如MyISAM )中,没有什么是“原子的”。特别是……
  • 使用MyISAM,中断的多行写入(插入/更新/删除)(例如,由于电源故障)可能已经完成了一些行--您无法知道有多少行。(这是避免MyISAM的一个重要原因。)
票数 2
EN

Stack Overflow用户

发布于 2016-08-18 12:08:40

一个单一的MySQL查询,无论是SELECT、INSERT还是其他任何东西,都应该是原子的,因为语句将完全成功并完成,或者失败并回滚。这并不意味着您的INSERT将在隔离状态下运行,也不意味着它将完全兼容ACID,但它应该是原子的。

批处理插入返回该批处理插入的第一个ID的值。

我不知道您使用的是什么工具或接口,但是文档不这么说:

如果你用插入..。语句具有多个值列表或插入.选择时,该语句将以以下格式返回一个信息字符串: 记录: 100重复:0警告:0

例如,在JDBC中,API返回受INSERT操作影响的记录数,而不是插入的第一行的ID。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39017523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档