【问题标题】:mysql auto increment and unique fieldmysql自动增量和唯一字段
【发布时间】:2014-11-04 08:47:11
【问题描述】:

我在 php 中编写以下命令:

$query="insert into tableone (user_name, password, name, email) values('$user_name', '$password',   '$name', '$email')";
if(mysql_query($query))
{                                       
    header("Location:thislocation.php");
} else {
    echo '<br><br><font color="red"><strong>Username or EmailId already exists. Please try different Username.<br> If you have forgotten your Password <a href="forgotmypassword.php" title="Forgot Password?" alt="Forgot Password?"><u><i>click here</i></u></a>.</strong></font><br>';
}

在 mysql-db 中,我将 name 和 email 字段设置为唯一字段,并将 id 字段设置为自动递增,因此没有两个人拥有相同的注册记录。问题是,如果有人使用相同的用户名或电子邮件,则查询失败并执行 else 语句。但是,它会自动增加 id,而不会在 db 中添加记录。如果之后有人注册成功,他得到的 id 不会比前一个多 2。

如何只自动递增一次?

【问题讨论】:

  • 何必费心呢?这只是一个 id,无论如何,当帐户被删除时,您会得到空白。
  • 在保存之前添加验证。
  • 您应该在插入之前使用选择查询进行检查
  • 它的 MySQL 功能,在尝试插入重复项之前进行检查的最佳方法
  • @gerald Schneider 如果我有太多用户使用我的应用程序...假设百万(只是开玩笑)...我希望我的数据库看起来干净吗?

标签: php mysql unique auto-increment


【解决方案1】:

没有真正的解决办法;这就是自动增量 ID 的工作方式。 ID 并不是为了“干净”而设计的,它们旨在满足能够将数据链接在一起的需求。

让您的数据库保持井然有序将是一项巨大的工作,而且(这是最重要的部分)没人关心它们是否对齐。它们是没有实际意义的数字(根据数据库 ID 的定义),因此它们无关紧要。

它们通常“有序”的唯一原因是因为生成它们的方法很简单。

【讨论】:

  • 非常感谢,但如果我想计算总数。通过我的 id 获得的用户数量?
  • 你没有。您可以通过 COUNT 查询来计算用户数。
  • @sgt 这就是答案。 id 仅适用于数据库,用于跟踪行。这些数字应该在插入失败时被丢弃,这就是我们确保并发访问是原子的方式。人们总是希望保持自动增量对齐,而实际上这并不重要。如果是 1 和下一个 1500 - 那又如何?它的工作是唯一标识一条记录,而不是满足某人的强迫症。
【解决方案2】:

您需要做的是在插入之前对其运行 num_rows。 num_rows是干什么的,它统计SELECT返回多少条记录,所以如果返回1,说明数据库中有一个地方有匹配,如果返回0,则没有匹配

$selectSql = "SELECT * FROM tableone WHERE name= '".$name."' OR email = '".$email."'";
$result = mysql_query($selectSql, $YOUR_DATABASECONNECTION);
$num_rows = mysql_num_rows($result);
if($num_rows){
echo "email or name is already taken";
}else{    
$query="insert into tableone (user_name, password, name, email) values('$user_name', '$password',   '$name', '$email')";
    if(mysql_query($query))
    {                                       
        header("Location:thislocation.php");
    } else {
        echo '<br><br><font color="red"><strong>Username or EmailId already exists. Please try different Username.<br> If you have forgotten your Password <a href="forgotmypassword.php" title="Forgot Password?" alt="Forgot Password?"><u><i>click here</i></u></a>.</strong></font><br>';
    }
}

这是确保不会发生您所说的错误的好方法

【讨论】:

  • 这不是真的。即使您的答案被接受,也远非正确。您不使用 PHP 检查记录是否存在。 PHP 和 MySQL 之间存在网络延迟和处理开销。当您在代码中发现没有这样的用户时,另一个进程可能会做同样的事情 - 您最终会得到 2 个用户收到误报。你的意思是你可以通过 PHP 来保证。不,你不能,不是 100%。
猜你喜欢
  • 2011-02-24
  • 2013-05-21
  • 2016-09-27
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多