我在下面有这个代码,据说会检测重复的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;
}
答案 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
依赖于数据库的自动增量会违反命令查询责任隔离,并且在构建大型应用程序时可能会出现问题。