0

我在下面有这段代码,据说它会检测到重复的 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;
 }
4

2 回答 2

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 重试插入。

冲突将非常罕见(几乎不可能),除非有数千万条记录(可能是数亿条),否则您不必担心对其进行优化。

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

所以我想总结一下,你提出的问题的具体答案可能只是尝试插入它。如果你得到一个 dup,要求一个新的 ID,然后再试一次。但根据您的用例,可能会有更好的策略。

于 2012-04-17T18:25:47.077 回答
0

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

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

于 2012-04-17T18:46:48.393 回答