2016-08-18 115 views
0

我有关于MySQL的bluk插入忽略陈述了几个问题,无论是InnoDB和MyISAM.An例如:MySQL的批量插入忽略

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

参考是一个独特的键也。

  1. 是一个批量插入原子吗?所以,如果我把这个发送到数据库,我可以放心,在这个声明之间没有其他插入发生?

  2. 批量插入返回插入批次的第一个ID的值。但是,如果第一次插入恰好是重复发生的事情(我会得到一个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值是重复的。这导致了令人惊讶的“燃烧”ID。 (并且消除了关于什么是“第一个ID”的问题。)
  • 在非事务引擎(如MyISAM)中,没有什么是“原子”的。特别是,...
  • 使用MyISAM,多行写入(插入/更新/删除)被中断(例如,由于电源故障),可能已经完成了一些行 - 您无法分辨出多少行。 (这是避免MyISAM的重要原因。)
0

一个单一的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,例如,API返回的受INSERT操作记录的数量,而不是插入第一行的ID。