【问题标题】:Retrieving the index of an inserted row检索插入行的索引
【发布时间】:2009-06-17 17:03:17
【问题描述】:

我正在尝试为我正在处理的项目保留数据库表并使其正常化,但我遇到了问题。我试图弄清楚如何在表中插入一行,然后找出 auto_incremented id 列的值设置为,以便我可以将其他数据插入另一个表。我知道有诸如mysql_insert_id 之类的函数“获取从先前的INSERT 操作生成的ID”。但是,如果我没记错的话mysql_insert_id 只是返回最后一个操作的 ID。因此,如果站点有足够的流量,则不一定会返回您想要的查询的 ID,因为在您插入行并查找 ID 之间可能已经运行了另一个查询。这种对mysql_insert_id的理解正确吗?非常感谢任何有关如何执行此操作的建议。谢谢。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    LAST_INSERT_ID() 具有会话范围。

    它将返回当前会话中插入的标识值。

    如果您不在INSERTLAST_INSERT_ID 之间插入任何行,那么它会正常工作。

    请注意,虽然对于多个值插入,它将返回插入的第一行的标识,而不是最后一行:

    INSERT
    INTO    mytable (identity_column)
    VALUES  (NULL)
    
    SELECT  LAST_INSERT_ID()
    
    --
    1
    
    INSERT
    INTO    mytable (identity_column)
    VALUES  (NULL), (NULL)
    
    /* This inserts rows 2 and 3 */
    
    SELECT  LAST_INSERT_ID()
    
    --
    2
    
    /* But this returns 2, not 3 */
    

    【讨论】:

      【解决方案2】:

      你可以:

      A.假设这不是问题并使用 mysql_insert_id

      B.在行中包含时间戳,并在插入另一个表之前检索最后插入的 ID。

      【讨论】:

        【解决方案3】:

        对此的一般解决方案是做以下两件事之一:

        1. 创建一个执行插入的过程查询,然后检索最后插入的 id(使用,即 LAST_INSERT_ID())并将其作为查询的输出返回。

        2. 进行插入,再进行一次插入,其中 id 值类似于 (select myid from table where somecolumnval='val')

        2b。或者使选择显式和独立,然后使用该值执行其他插入。

        第一个的缺点是您必须为每种情况编写一个过程。第二种方法的缺点是一些数据库引擎不接受这一点,并且它会使您的代码变得混乱,并且如果您必须在多个列上执行 where 可能会很慢。

        这假设您的调用之间可能存在您无法控制的插入。如果您有明确的控制权,则上述其他解决方案之一可能会更好。

        【讨论】:

          猜你喜欢
          • 2011-10-24
          • 1970-01-01
          • 2013-11-28
          • 2015-12-27
          • 1970-01-01
          • 2014-09-23
          • 2019-01-11
          • 1970-01-01
          • 2010-09-19
          相关资源
          最近更新 更多