【问题标题】:MySQL Bulk Insert IgnoreMySQL批量插入忽略
【发布时间】:2016-08-18 11:52:40
【问题描述】:

我有几个关于 MySQL bluk insert Ignore 语句的问题,包括 InnoDB 和 MyISAM。一个例子:

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

引用也是唯一键。

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

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

亲切的问候,

【问题讨论】:

    标签: mysql insert innodb bulkinsert myisam


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-07
        • 2019-09-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多