class表结构如下(id,className)其中id为自动增长类型的主键,className为varchar(255)字符串类型
id classNamestudent表结构如下(id,studentName)其中id不是自动增长类型的主键,studentName为varchr(255)字符串类型
id student我现在要连续插入一条数据,是这样的如下:
mysql_query ("insert into className values(一班级')");
$id = mysql_insert_id();//获取刚刚插入的id
mysql_query ("insert into studentName values('张三')");现在的问题是,mysql_insert_id();在多线程的时候,会不会获取别的页面的最后插入的id?这样就麻烦了。

解决方案 »

  1.   

    不会的
    mysql_insert_id()只返回当前连接的AUTO_INCREMENT 
    最后产生的 ID 是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。
      

  2.   

    mysql_insert_id确实不太安全,不过不是因为线程而不安全。是因为mysql_insert_id返回的是一个int类型,如果数据库的自增字段是bigint,这个字段的数值就有可能超过int的最大值,导致结果的不正确。我是遇到过这个问题的。解决方法是利用SQL语句来获取id:SELECT LAST_INSERT_ID()。这个问题即使是在64位机器上也依然存在,除非bigint没用unsigned标志。因为php的int类型是用long来存储,long在32位机器是4bytes,在64位机器是8bytes。所以在32位必然存在这个问题,而在64位,因为php的int是有符号的,所以只有63个bits来存储数据。当bigint unsigned的时候,就存在溢出的问题。
      

  3.   

    解决方法是利用SQL语句来获取id:SELECT LAST_INSERT_ID()。 
    楼上的朋友,上面是您的方案,不知道 LAST_INSERT_ID()。 
    是php自己带的函数还是你自己写的函数,从表面上看是不是和
    select max(id) from tableName limit 1;相同呢?
    如果相同的话,那您的方法也不实际啊?
    必竟管理网站的不可能是一个人,这样如果多个用户操作的话,启不是会出错,不好意思,这是我的个人意见,还请您指教!!!!!!!!!!!!!!
      

  4.   

    LAST_INSERT_ID()是mysql提供的函数,不是PHP,也不是我提供的。$rs=mysql_query('SELECT LAST_INSERT_ID()');
    var_dump(mysql_fetch_array($rs));
      

  5.   

    8楼讲的不错.LAST_INSERT_ID()是 MySQL 内部的 SQL 函数.在bigint下使用这个函数。mysql手册中说SELECT last_insert_id()是多用户安全的。
      

  6.   

    mysql_insert_id()只返回当前连接的AUTO_INCREMENT