如何防止错误的ID

时间:2010-09-14 09:33:42

标签: php mysql database primary-key

database = mysql language = php

我正在编写程序来像这样工作

PC1 = computer1

步骤

1.PC1从自动增量插入数据,新ID。

2.PC1选择最后一个ID

一切正常但是......

许多计算机在同一mili-sec使用您的代码时出现的问题。 例如

  1. PC1插入数据,自动递增新ID
  2. 2.PC2插入数据,自动递增新ID

    3.PC1选择最后一个ID< -------错误

    4PC2选择最后一个ID

    如何配置数据库或修改php代码以防止这种情况,谢谢你。

4 个答案:

答案 0 :(得分:3)

您应该使用mysql_insert_id(或您正在使用的API的等效调用)来获取最后插入的行的ID。

我想你现在正在这样做:

SELECT MAX(id) FROM yourtable

除非您使用交易,否则此操作无效。但是使用函数mysql_insert_id是更好的方法。


在文件中还有一个警告和一些注意事项,你应该阅读:

  

警告:mysql_insert_id()会将原生MySQL C API函数mysql_insert_id()的返回类型转换为long类型(在PHP中命名为int)。如果AUTO_INCREMENT列的列类型为BIGINT(64位),则转换可能会导致值不正确。而是在SQL查询中使用内部MySQL SQL函数LAST_INSERT_ID()。

     

注意:因为mysql_insert_id()作用于上次执行的查询,所以请务必在生成值的查询后立即调用mysql_insert_id()。

     

注意:MySQL SQL函数LAST_INSERT_ID()的值始终包含最近生成的AUTO_INCREMENT值,并且不会在查询之间重置。

答案 1 :(得分:2)

如果你打电话

,在mysql中

SELECT LAST_INSERT_ID();

您将获得当前连接的最后一个自动生成的ID,而不是整个服务器。因此,如果在另一个连接中创建了另一个记录,它将不会影响LAST_INSERT_ID()返回的结果。

答案 2 :(得分:2)

MySQL将在每个客户端(计算机)连接的任何INSERT语句之后立即返回正确的最后插入ID,因此您不必担心;服务器不会混淆它们。来自documentation

  

每个客户端将收到客户端执行的最后一个语句的最后插入ID。

只要您在PHP代码中调用mysql_insert_id()来检索插入ID,就没什么可担心的了。

答案 3 :(得分:2)

mySQL具有LAST_INSERT_ID()功能。

PHP等价物(如果使用经典的mysql函数)是mysql_insert_id(),但在INSERT查询后该函数应该被称为立即,因为它作用于最后一次查询

这些功能基于per 连接,不会受到其他客户端插入的记录的影响。