此代码是否是防止重复ID的正确方法?

时间:2012-04-17 18:12:56

标签: 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); 
     $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;
 }

2 个答案:

答案 0 :(得分:4)

最好的方法是允许MySQL使用auto_increment创建ID。

CREATE TABLE table_name (
   id int(12) NOT NULL AUTO_INCREMENT,
   /* other columns... */
   PRIMARY KEY (id)
);

然后您只需插入而不指定ID列。要检索该值,请使用mysql_insert_id()

如果有一些有效的理由你不能使用auto_increment(你无法控制数据库,至少有10个IT人员被告知没有至少一百次),那么下一个解决方案就是添加一个列上的唯一索引,这将阻止输入重复。

CREATE UNIQUE INDEX index_name ON table_name (id);

这可以防止任何重复。如果由于违反了唯一键而导致插入尝试失败(将出现在错误消息中),则只需使用新GUID重试插入即可。

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

没有其他很多可以避免竞争条件的好选择。你可以通过交易来管理它,但是在你目前的理解水平上它会变得非常非常棘手,而且几乎在所有情况下都会浪费你的时间给出这两个选项。

所以我想总结一下,你提出的问题的具体答案可能只是尝试插入它。如果您获得了重复,请提出新ID,然后重试。但根据您的使用情况,可能有更好的策略。

答案 1 :(得分:0)

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

依赖于数据库的自动增量会违反命令查询责任隔离,并且在构建大型应用程序时可能会出现问题。