我想在一个表中插入一些值,该表具有一个自动递增字段作为主键.然后,我想通过使用mysql_insert_id()检索ID并将此ID用作另一个表中的外键.问题是-尽管可能性很小-在第一次插入和以后的检索之间可能会发生另一次插入到第一个表中,因此将返回错误的ID.
PHP是否会自动处理此问题,还是我的担忧有效?如果是这样,我该如何克服它们?
解决方法:
mysql_insert_id()将基于每个连接返回最后插入的id.因此,基本上,您不必担心并发脚本请求.
供参考:see the MySQL docs.
编辑:
顺便说一句,您可以很容易地对此进行测试.
test.php
<?php
$sleep = isset( $_GET[ 'sleep' ] ) ? true : false;
$conn = mysql_connect( /* your parameters */ );
mysql_select_db( /* your db */, $conn );
$sql = 'INSERT INTO yourtable(id,col1,col2) VALUES(null,"test","test")';
mysql_query( $sql );
if( $sleep ) sleep( 5 );
echo mysql_insert_id();
?>
打开两个浏览器标签:
首先要求:
http://localhost/test.php?sleep=1
请在第二秒内(例如,最多4秒)内请求:
http://localhost/test.php
第一个请求应该给您的ID少于第二个请求.