MySQL批量插入忽略

时间:2016-08-18 11:52:40

标签: mysql insert innodb bulkinsert myisam

我对InnoDB和MyISAM的MySQL bluk insert Ignore语句提出了一些问题。例如:

INSERT IGNORE INTO table(`reference`) VALUES ('1','2','3')

参考也是一个独特的密钥。

  1. 批量插入是原子的吗?因此,如果我将此发送到数据库,我可以放心,在此声明之间不会发生其他插入吗?

  2. 批量插入返回批次插入的第一个ID的值。但是,如果第一个插入碰巧是重复的话会发生什么(我将0作为返回值,或者是下一个(成功插入返回,我无法在文档中找到)

  3. 亲切的问候,

2 个答案:

答案 0 :(得分:2)

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

  • 语法错误:您有1列,但有3个值。也许你的意思是这个? ... VALUES (1), (2), (3)
  • 在修复之后,您的一个语句基本上等同于事务中包含的三个1行INSERT IGNOREs(如果使用InnoDB)。
  • 由于IGNORE,任何重复的密钥都不会中止插入。
  • VARIABLE innodb_autoinc_lock_mode控制多行AUTO_INCREMENT期间INSERT发生的事情。需要知道它的价值才能完全回答这个问题。默认情况下,AUTO_INCREMENT id将增加3,无论有多少reference个值是重复的。这会导致惊喜"燃烧" ids。 (并且消除了关于" First ID"是什么的问题。)
  • 什么都不是" atomic"在诸如MyISAM的非事务引擎中。特别是......
  • 使用MyISAM,中断(例如,断电)的多行写入(插入/更新/删除)可能已经完成了一些行 - 您无法分辨多少行。 (这是避免MyISAM的重要原因。)

答案 1 :(得分:0)

单个MySQL查询,无论是SELECTINSERT还是其他任何东西,都应该是原子的,因为该语句将完全成功并完成,或者失败并被回滚。这并不意味着您的INSERT将独立运行或者它将完全符合ACID,但它应该是原子的。

  

批量插入返回批次插入的第一个ID的值。

我不知道您使用的是什么工具或界面,但documentation说不然:

  

如果使用带有多个值列表的INSERT ... VALUES语句或INSERT ... SELECT,则该语句将返回以下格式的信息字符串:

     

记录:100个重复:0个警告:0

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