gpt4 book ai didi

php - 在插入时获取一张表的 auto_increment 值的最佳方法

转载 作者:行者123 更新时间:2023-11-29 12:57:17 25 4
gpt4 key购买 nike

在我的数据库中有三个表,它们是

posts{ post_id , title , description ,etc ,etc}
tags{ tag_id , tag_name , tag_type }
tags_for_post{ tag_ref_id , post_ref_id}

正如您所见,一旦我在 posts 表中插入一行,我将需要该行的 post_id 值来更新我的 tags_for_posts 表。也就是说,哪些标签被标记在哪个帖子中存储在 tags_for_posts 表中,为此,我需要相应的帖子 post_id 值。

所以我的问题是如何在插入时获得自动递增的值(即post_id)???但是有一个问题

它将在服务器上运行,因此多个客户端会同时访问它。因此可能会发生两个客户端同时访问posts表的情况。那么我如何确保last_insert_id()将给出相应的帖子post_id

所以我想分三步完成,例如:

  1. posts表中输入几列数据,获取该行的auto_incremented post_id值
  2. 现在使用该行的 post_id 值在 tag_for_post 表中插入相应的标签。
  3. 再次进入posts表完成剩余计算和更新。

正如我之前所说,我遇到的主要问题是如何确保即使多个客户端同时访问它,我也始终可以获得相应行的 post_id 值。 我不认为 mysql_insert_idLAST_INSERT_ID() 可以用于此目的,因为多个客户端可以尝试同时插入。那么我如何保证每次我会得到对应行的id

现在,在将其标记为重复线程之前,我想说我已经在 google 和 stackoverflow 中进行了很多搜索,其中大多数建议使用 mysql_insert_idLAST_INSERT_ID() 和正如我所说,我对此不满意,因为我认为它不会同时为多个访问提供所需的结果。

我找到了两个可能解决我的问题的解决方案 using procedureusing transaction:stackoverflow

在 stackoverflow 解决方案中,他们说将代码编写为::

begin transaction
insert into your table (half empty values);
$id = get last autoincrement id
do calculations
update set data = full data where id = $id
commit transaction

现在我的问题是::

  1. 上面的代码能正确解决我的问题吗?
  2. 我需要编写额外的代码来实现上述代码吗?
  3. 如果使用上面的代码无法解决问题那么我该如何解决?
  4. 上面的代码是否确保即使在同时插入多个的情况下也始终返回相应的post_id
  5. 例如,假设一个客户端已发出 inseret 命令,并且在该客户端发出 $id = get last autoincrement id 之前,另一个客户端已发出insertcommand.现在第一个客户端会得到他使用上面代码插入的行的id吗??

最佳答案

最后一个插入ID对于每个连接的客户端都是唯一的,它仅指向该客户端插入的最后一个ID,而不指向其他客户端插入的其他ID。

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.

换句话说,如果您考虑多线程,则不需要为此执行任何类型的锁定。

关于php - 在插入时获取一张表的 auto_increment 值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23844281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com