我对InnoDB和MyISAM的MySQL bluk insert Ignore语句提出了一些问题。例如:
INSERT IGNORE INTO table(`reference`) VALUES ('1','2','3')
参考也是一个独特的密钥。
批量插入是原子的吗?因此,如果我将此发送到数据库,我可以放心,在此声明之间不会发生其他插入吗?
批量插入返回批次插入的第一个ID的值。但是,如果第一个插入碰巧是重复的话会发生什么(我将0作为返回值,或者是下一个(成功插入返回,我无法在文档中找到)
亲切的问候,
答案 0 :(得分:2)
这里发生了很多事情......
... VALUES (1), (2), (3)
。INSERT IGNOREs
(如果使用InnoDB)。IGNORE
,任何重复的密钥都不会中止插入。innodb_autoinc_lock_mode
控制多行AUTO_INCREMENT
期间INSERT
发生的事情。需要知道它的价值才能完全回答这个问题。默认情况下,AUTO_INCREMENT id
将增加3,无论有多少reference
个值是重复的。这会导致惊喜"燃烧" ids。 (并且消除了关于" First ID"是什么的问题。)答案 1 :(得分:0)
单个MySQL查询,无论是SELECT
,INSERT
还是其他任何东西,都应该是原子的,因为该语句将完全成功并完成,或者失败并被回滚。这并不意味着您的INSERT
将独立运行或者它将完全符合ACID,但它应该是原子的。
批量插入返回批次插入的第一个ID的值。
我不知道您使用的是什么工具或界面,但documentation说不然:
如果使用带有多个值列表的INSERT ... VALUES语句或INSERT ... SELECT,则该语句将返回以下格式的信息字符串:
记录:100个重复:0个警告:0
例如,在JDBC中,API返回受INSERT
操作影响的记录数,而不是插入的第一行的ID。