php - SQL Insert获取ID时同步

标签 php mysql sql

好吧,首先,我承认我从这个问题中提取了元素:How to get result of Insert

无论如何,我有两个表,在第二个表中有表 A 的外键列。

表A:

id       Name
----------------
1        Name1
2        Name2

表B:

id       Name      Parent
-------------------------
1        John      1

问题是我需要插入到表 A 中的任何内容的 ID,以用于表 B 中的外键。

接受的答案是以下 PHP 代码:

$res = mysql_query('SELECT LAST_INSERT_ID()');
$row = mysql_fetch_array($res);
$lastInsertId = $row[0];

我在别处看到过类似的代码,但这里不是有同步问题吗?难道不能在一个 SQL 插入和使用 SELECT LAST_INSERT_ID() 获取 ID 之间恰好发生不同的 SQL 插入吗?因此以错误的 ID 结束?

谢谢,

山姆

最佳答案

无论是使用函数 mysql_insert_id() 还是您在问题中描述的方法都是可靠且并发安全的。这两种方法都使用事件连接,您指出的并发问题是预期的并在内部处理。

如果你用谷歌搜索这个问题,你会看到一些人提倡使用“SELECT MAX(id) FROM some_table”,它确实有你担心的并发问题,不应该使用。上述两种方法都没有这个问题,同样是“最佳实践”。

您可以在这里阅读更多关于 MySQL 函数的讨论:http://dev.mysql.com/tech-resources/articles/storage-engine/part_3.html

那篇文章的相关部分:

SELECT LAST_INSERT_ID();

This is a special construct, and again it's perfectly safe without manual locks, no matter how many concurrent connections the server has.

在 PHP 文档中,您可以看到 mysql_insert_id() 将连接作为参数,或者它假定最后打开的连接:http://php.net/manual/en/function.mysql-insert-id.php

关于php - SQL Insert获取ID时同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5956079/

相关文章:

php - JavaScript 构造等同于 PHP 的 list()?

php - 使用 jQuery AJAX 从 Laravel 5 中的联系表单发送电子邮件

javascript - 如何检查多个字符串变量是否不为空或为空?

mysql - cakephp和mysql中字段的最小值和最大值

java - 如何创建自定义日期?

sql - 插入后使用触发器更新多行(sql server)

php - 在一个页面上组合多个 Controller ,而无需从 Controller 加载 Controller

mysql - 如何将自定义日期插入 mysql 时间戳字段?

php - MySql - 将字段枚举类型更改为 tinyint 时的奇怪行为

php - 在MySQL中,我可以在分配索引时在一张表中看到2个id