【发布时间】:2014-05-14 01:26:08
【问题描述】:
现在,“重复密钥更新”时什么也不做。 所以,
INSERT IGNORE INTO t1 c1 VALUES(...,...,...);
last_insert_id 最多只有一个 id。
那么如何在“insert ignore”语句中检测多个插入的id?
【问题讨论】:
现在,“重复密钥更新”时什么也不做。 所以,
INSERT IGNORE INTO t1 c1 VALUES(...,...,...);
last_insert_id 最多只有一个 id。
那么如何在“insert ignore”语句中检测多个插入的id?
【问题讨论】:
使用 LAST_INSERT_ID()
我不知道常规批量INSERT 可以返回多个LAST_INSERT_ID()。它将始终返回为该批量 INSERT 语句插入的第一条记录的 ID。
您可以查看上面的文档,其中解释了here
生成的 ID 保存在服务器上的 每个连接的基础。这意味着返回的值 给定客户端的函数是生成的第一个 AUTO_INCREMENT 值 对于影响 AUTO_INCREMENT 列的最新语句 客户。
强调为影响 AUTO_INCREMENT 列的最新语句生成的第一个 AUTO_INCREMENT 值。因此,如所述,通过批量插入的第一个成功行 INSERT 将是 LAST_INSERT_ID() 的返回值。
在 InnoDB 中使用 LAST_INSERT_ID() 和 ROW_COUNT()
有一个替代解决方案as posted by Dag Sondre Hansen here 可能适合您的需求。它确实假定您的表/数据库使用 InnoDB。
如果您在最新版本的 MySQL 上使用 InnoDB,您可以获得 使用 LAST_INSERT_ID() 和 ROW_COUNT() 的 ID 列表。
InnoDB 在执行时保证 AUTO INCREMENT 的序号 批量插入,前提是 innodb_autoinc_lock_mode 设置为 0 (传统)或 1(连续)。因此,您可以获得第一个 ID 来自 LAST_INSERT_ID() 和最后一个通过添加 ROW_COUNT()-1。
只需确保在同一连接上直接在 INSERT 语句之后执行此操作,否则您将无法获得预期的结果。
【讨论】: