MySQL 批量插入忽略

MySQL Bulk Insert Ignore

我有几个关于 MySQL bluk insert Ignore 语句的问题,包括 InnoDB 和 MyISAM.An 示例:

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

引用也是唯一键。

  1. 批量插入是原子的吗?因此,如果我将此发送到数据库,我可以确保在此语句之间没有其他插入发生吗?

  2. 批量插入returns 批量插入的第一个 ID 的值。但是,如果第一个插入恰好是重复的(我得到一个 0 作为 return 值还是下一个(成功插入 returned,我在文档中找不到这个)

亲切的问候,

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

A batch insert returns the value of the First ID inserted of the batch.

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

If you use an INSERT ... VALUES statement with multiple value lists or INSERT ... SELECT, the statement returns an information string in this format:

Records: 100 Duplicates: 0 Warnings: 0

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

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

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