检索插入行的索引

时间:2009-06-17 17:03:17

标签: php mysql

我正在尝试保留一个项目的数据库表,我正在进行良好的规范化,但我遇到了一个问题。我试图找出如何在表中插入行,然后找出auto_incremented id列的值设置为什么,以便我可以将其他数据插入另一个表。我知道有mysql_insert_id之类的函数可以“获取先前INSERT操作生成的ID”。但是,如果我没有弄错mysql_insert_id,只返回最后一次操作的ID。因此,如果站点有足够的流量,则不一定会返回所需查询的ID,因为在插入行并查找ID之间可能会运行另一个查询。这是对mysql_insert_id的理解是否正确?任何有关如何做到这一点的建议都非常感谢。感谢。

3 个答案:

答案 0 :(得分:5)

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 */

答案 1 :(得分:0)

你可以:

一个。假设这不会成为问题并使用mysql_insert_id

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

答案 2 :(得分:0)

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

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

  2. 执行插入操作,在id值类似的位置执行另一个插入操作(从table中选择myid,其中somecolumnval ='val')

  3. 2B。或者使select显式和独立,然后使用该值执行其他插入。

    第一个缺点是你必须为每个案例编写一个proc。第二个缺点是某些数据库引擎不接受它,它会使你的代码变得混乱,如果你必须在多个列上进行操作,那么它可能会很慢。

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