Php 插入时获取一个表的自动递增值的最佳方法
在我的数据库中有三个表,它们是Php 插入时获取一个表的自动递增值的最佳方法,php,mysql,sql-server,transactions,distributed-transactions,Php,Mysql,Sql Server,Transactions,Distributed Transactions,在我的数据库中有三个表,它们是 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\u id值来更新我的posts表的标签。也就是说,哪些标签被标记在哪个帖子被存储在tags\u for\u posts表中,为此,我
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\u id
值来更新我的posts
表的标签。也就是说,哪些标签被标记在哪个帖子被存储在tags\u for\u posts
表中,为此,我需要相应的postspost\u id
值
因此我的问题是如何在插入时获得自动递增的值(即post\u id
)?但存在一个问题
它将在服务器上运行,因此多个客户端将同时访问它。因此,可能会出现两个客户端同时访问posts
表的情况。那么,我如何确保最后一个插入id()将给出相应的postpost\u id
所以我想分三步来做,比如:
posts
表中输入少数列的数据,并获取此行的自动递增post\u id值post\u id
值用于在tag\u中插入相应的标签,以用于post
表posts
table完成rest计算和更新post\u id
值我不认为mysql\u insert\u id
或LAST\u insert\u id()
可以用于此目的,因为多个客户端可以尝试同时插入。那么我如何确保每次都能获得对应行的id
现在,在将其标记为重复线程之前,我想说我在google和stackoverflow中搜索了很多,其中大多数建议使用mysql\u insert\u id
或LAST\u insert\u id()
,正如我所说的,我对此不满意,因为我认为它不会同时提供多个访问所需的结果
我已经找到了两种可能解决我的问题的解决方案
在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
现在我的问题是:
post\u id
inseret
命令,在该客户机发出$id=get last autoincrement id
之前,另一个客户机已经发出了insert
命令。现在第一个客户机将获得他使用上述代码插入的行的id吗最后一个插入ID对于连接的每个客户端都是唯一的,它只指向该客户端插入的最后一个ID,而不指向其他客户端插入的其他ID 生成的ID在服务器上的 每个连接的基础。这意味着 给定客户端的函数是生成的第一个自动增量值 对于影响自动增量列的最新语句 客户此值不受其他客户端的影响,即使它们 生成它们自己的自动增量值。这种行为确保 每个客户端都可以检索自己的ID,而不必考虑 其他客户端的活动,并且不需要锁或 交易
换句话说,如果您考虑了多线程,则不需要为此执行任何类型的锁定。那么您有什么建议吗??使用事务处理是否是更好的方法???或者我应该使用该
最后一个插入ID
?,哪一个更安全?获取最后一个插入ID总是安全的,但是如果您需要同时更新这两个表,以防止用户在处理它们时出错访问它们,那么你需要一个事务或锁。yp能详细说明一下吗?我说过我想分三步来做吗?现在你有什么建议吗?我可以在事务中使用last\u insert\u id()
吗?使用事务的缺点是什么?