好吧,首先,我承认我从这个问题中提取了元素: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/