Php 这段代码是防止重复ID的正确方法吗?

Php 这段代码是防止重复ID的正确方法吗?,php,mysql,validation,duplicates,Php,Mysql,Validation,Duplicates,我在下面有一段代码,它可能会检测到重复的id生成,并且不会执行。这段代码是否足以防止重复ID //$guid and $alphabet are other sources from which id is generated $unique = false; while($unique == false){ $Guid = NewGuid(); ob_start(); echo base_encode($Guid, $alphabet); $ne

我在下面有一段代码,它可能会检测到重复的id生成,并且不会执行。这段代码是否足以防止重复ID

 //$guid and $alphabet are other sources from which id is generated
 $unique = false;
 while($unique == false){
     $Guid = NewGuid();
     ob_start();
     echo base_encode($Guid, $alphabet); 
     $newid = ob_get_contents();
     ob_get_clean();

     $query = "SELECT * FROM posts WHERE id='$newid'";
     $res = mysql_query($query) or die(mysql_error());
     if(mysql_num_rows($res) == 0) 
         $unique = true;
 }

最好的方法是允许MySQL使用自动增量创建ID

CREATE TABLE table_name (
   id int(12) NOT NULL AUTO_INCREMENT,
   /* other columns... */
   PRIMARY KEY (id)
);
然后,只需插入而不指定ID列。要检索该值,请使用mysql\u insert\u id()

如果有正当理由不能使用auto_increment(您无法控制数据库,并且至少有10名IT人员告诉您至少100次没有),那么下一个解决方案将是在列上添加唯一索引,这将防止输入重复项

CREATE UNIQUE INDEX index_name ON table_name (id);
这将防止任何重复。如果由于违反了唯一密钥(将出现在错误消息中),插入尝试失败,您只需使用新GUID重试插入

碰撞将是非常罕见的(几乎不可能的),因此您不必真正担心优化它,除非将有数千万条记录(可能是数亿条)

不会有很多其他好的选择可以避免比赛条件。您可以通过事务来管理它,但在您当前的理解水平上,这将是非常非常棘手的,而且考虑到上述两个选项,几乎所有情况下都是在浪费您的时间


因此,我想总结一下,你提出的问题的具体答案可能是尝试插入它。如果您收到dup,请要求提供新ID,然后重试。但是根据您的用例,可能有更好的策略。

最好的方法是允许MySQL使用自动增量创建ID

CREATE TABLE table_name (
   id int(12) NOT NULL AUTO_INCREMENT,
   /* other columns... */
   PRIMARY KEY (id)
);
然后,只需插入而不指定ID列。要检索该值,请使用mysql\u insert\u id()

如果有正当理由不能使用auto_increment(您无法控制数据库,并且至少有10名IT人员告诉您至少100次没有),那么下一个解决方案将是在列上添加唯一索引,这将防止输入重复项

CREATE UNIQUE INDEX index_name ON table_name (id);
这将防止任何重复。如果由于违反了唯一密钥(将出现在错误消息中),插入尝试失败,您只需使用新GUID重试插入

碰撞将是非常罕见的(几乎不可能的),因此您不必真正担心优化它,除非将有数千万条记录(可能是数亿条)

不会有很多其他好的选择可以避免比赛条件。您可以通过事务来管理它,但在您当前的理解水平上,这将是非常非常棘手的,而且考虑到上述两个选项,几乎所有情况下都是在浪费您的时间


因此,我想总结一下,你提出的问题的具体答案可能是尝试插入它。如果您收到dup,请要求提供新ID,然后重试。但是,根据您的用例,可能有更好的策略。

php有一个生成唯一id的函数,例如uniqid


依赖数据库的自动增量违反了命令查询责任分离,在构建大型应用程序时可能会导致问题。

php具有生成唯一id的功能,例如uniqid


依赖数据库的自动增量违反了命令-查询-责任分离,在构建大型应用程序时可能会导致问题。

不,这是很快的。什么是
NewGuid()
?如果您生成一个全局唯一标识符,那么它是非唯一的可能性非常小。究竟为什么它会回显到输出缓冲区并读回到
$newid
!??你从错误的角度来处理这个问题。如果您将主键设置为autoincrement,数据库可以为您生成一个ID,为什么不直接这样做?@gordonm这将只是数字我需要5个字母数字密码。不,这很快。什么是
NewGuid()
?如果您生成一个全局唯一标识符,那么它是非唯一的可能性非常小。究竟为什么它会回显到输出缓冲区并读回到
$newid
!??你从错误的角度来处理这个问题。如果您将主键设置为autoincrement,数据库可以为您生成一个ID,为什么不直接这样做?@gordonm这将只是数字我需要5个字母数字密码。对“大型应用程序”的影响是一个值得考虑的有趣设计点。不过,我不想把它写成一个笼统的声明。如果你打算建议使用
uniqid
,那么至少应该提到
前缀
更多熵
的许多注意事项,这对创建一个真正唯一的ID至关重要。此外,问题是如何防止重复;uniqid不能保证永远不会出现重复,即使应用了
更多的熵,这个问题仍然没有答案……对“大型应用程序”的影响是一个值得考虑的有趣设计点。不过,我不想把它写成一个笼统的声明。如果你打算建议使用
uniqid
,那么至少应该提到
前缀
更多熵
的许多注意事项,这对创建一个真正唯一的ID至关重要。此外,问题是如何防止重复;uniqid不能保证永远不会有重复的,即使应用了
更多的熵
,这个问题仍然没有答案。。。