我需要做什么(如果有的话)来确保 $mdb2->lastInsertID() 返回该连接的自动增量值?

发布于 2024-10-31 11:38:35 字数 351 浏览 1 评论 0原文

我最近从 SQL Server 切换到 MySQL,但在任何地方都找不到这个问题的足够可靠的答案:

我在需要锁定的表上使用 PHP、MySQL 和 InnoDB 表引擎。因此,对于包含 3 个语句的标准系列:

  1. Insert into table A
  2. $id = $mdb2->lastInsertID()
  3. Insert into table B (name, fk) VALUES ('foo', $id)

我需要采取哪些步骤确保 $id 具有步骤 1 中插入的值?就这样好吗?一切都需要在交易中吗?我是否需要添加其他查询来锁定和释放表?

谢谢你们。

I've made the switch recently from SQL Server to MySQL, and I can't find a solid enough answer to this question anywhere:

I'm using PHP, MySQL, and the InnoDB table engine on the tables I need to lock. So for a standard series of 3 statements:

  1. Insert into table A
  2. $id = $mdb2->lastInsertID()
  3. Insert into table B (name, fk) VALUES ('foo', $id)

what steps do I need to take to make sure $id has the value of the insert from step 1? Is it fine the way it is? Does everything need to be in a transaction? Do I need to add other queries to lock and release the tables?

Thanks guys.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如歌彻婉言 2024-11-07 11:38:35

你应该/可以,但你不需要做任何事情:
信息函数,function_last-insert-id

生成的 ID 在服务器中基于每个连接进行维护。这意味着该函数返回给给定客户端的值是为该客户端影响 AUTO_INCRMENT 列的最新语句生成的第一个 AUTO_INCRMENT 值。该值不会受到其他客户端的影响,即使它们生成自己的 AUTO_INCRMENT 值。此行为确保每个客户端都可以检索自己的 ID,而无需关心其他客户端的活动,也不需要锁或事务。

You should/could, but you don't NEED to do anything:
information-functions , 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.

万水千山粽是情ミ 2024-11-07 11:38:35

如果任何查询失败,最好使用事务,至少可以回滚其他更新。

或者自己处理

如果步骤 3 失败,您将收到来自 mysql 的错误消息,将该消息存储在变量中并检查是否收到删除在步骤 1 中插入的记录。

这就是事务处理的全部内容。你应该使用交易。

Better to use transaction if any query fails at least other updates can be rolled back.

OR handle by yourself

If the step 3 fails you will receive error message from mysql store that message in variable and check for that if received delete the record inserted in 1 step.

That is all what transaction handle. You should use transaction.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文