【问题标题】:Can I retrieve the lastInsertId from a bulk insert?我可以从批量插入中检索 lastInsertId 吗?
【发布时间】:2009-09-17 17:53:54
【问题描述】:
INSERT INTO details (idactivity,user,hours,val,date) VALUES ('981','133','0','10500','2008-07-01'),('981','184','0','2750','2008-07-01'),('981','184','0','2750','2008-07-01')

(iddetails作为明细表PK)

有没有办法获取 3 个新的 iddetail 并将它们用于下一个批量插入查询?

INSERT INTO activity (idactivity,iddetails) VALUES('981',??),('981',??),('981',??)

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    在 MySQL 手册中有对behavior of last_insert_id() with multi-row insert statements 的详细讨论。向下滚动到红色竖条以“重要”开头的部分。

    【讨论】:

    【解决方案2】:

    我认为您必须一次插入一个。 MySQL 的 last_insert_id 只会给你用这样的多行插入语句插入的第一个元素的 id。如果您有多个进程同时插入行,则可能会出现问题。

    但是,(我还没有验证这一点,)如果你使用 InnoDB 表,那么语句应该在隐式事务中执行,所以你应该能够假设生成的 id 是连续的。

    如果您有事务,另一种方法是锁定表,并手动更新它的 AUTO_INCREMENT 属性。例如,如果您有 50 行要插入,则将其增加 50 行。然后解锁表,并插入您的行,显式使用您保留的 id。您将需要为此(或至少表锁)进行转换,这样您就不会读取 AUTO_INCREMENT,然后在更新之前让某人插入新行。

    【讨论】:

    • “应该能够假设生成的 ids 是连续的” - 不是没有锁定表拳头。
    【解决方案3】:

    据我所知,不在mysql

    【讨论】:

      【解决方案4】:

      如果您使用日期时间而不是仅使用日期,则可以根据用户和日期时间值查找插入的 id,但这可能更好,因此如果您需要该数据,则不要进行批量插入。否则无论如何你最终都会运行更多的查询。

      【讨论】:

      • 不是唯一的 - CONNECTION_ID() 会更好,但除非与事务标志结合使用,否则仍可能导致持久连接出现别名。
      【解决方案5】:

      您可以为 GUID 添加一个数据库字段,并为每条记录存储一个随机字段。然后另一个查询可以提取 ID

      【讨论】:

        【解决方案6】:

        使用 SELECT last_insert_id( ) ;查询可以得到最后插入的id。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-13
          • 2010-11-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多