检查记录是否存在的最干净的方法


Cleanest way to check if a record exists

我使用以下代码检查数据库中是否存在行:

$sql = "SELECT COUNT(1) FROM myTable WHERE user_id = :id_var";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id_var', $id_var);
$stmt->execute();
if ($stmt->fetch()[0]>0)
{
    //... many lines of code
}

所有的代码工作和我的疑虑都是关于以前的代码是否干净高效,或者是否还有改进的空间。

目前有两个问题困扰着我以前的代码:

  1. 我的SQL语句末尾应该有一个LIMIT 1吗?COUNT(1)是否已经将找到的行数限制为1,或者服务器是否在找到第一条记录后仍在继续搜索更多记录
  2. if ($stmt->fetch()[0]>0)。这是从SQL查询中获取信息并执行"if conditional"的最干净的方法吗

当然,如果有人发现任何其他可以改进我的代码的地方,我会喜欢你的反馈。

Q:我的SQL语句末尾应该有一个LIMIT 1吗?COUNT(1)是否已经限制了由1找到的行数,或者服务器是否在找到第一条记录后仍在继续搜索更多记录?

如果执行成功,SELECT COUNT() FROM查询将返回一行,因为没有GROUP BY子句。没有必要添加LIMIT 1子句,它不会有任何影响。

数据库将搜索满足WHERE子句中条件的所有行。如果user_id列是UNIQUE,并且有一个以该列为前导列的索引,或者,如果该列是表的PRIMARY KEY。。。那么使用索引来搜索所有匹配的行将是有效的。如果没有索引,MySQL将需要搜索表中的所有行。

正是指数为您带来了良好的性能。您可以用不同的方式编写查询,以获得可用的结果。但你所拥有的一切都很好。

Q: 这是最干净的吗。。。

  if ($stmt->fetch()[0]>0)

我个人倾向于避免这种结构,并将其分解为两个或多个陈述。正常模式。。。单独的语句来获取行,然后进行测试。

就我个人而言,我倾向于避免使用COUNT(),只获取一行,并测试是否有行要获取。。。

  $sql = "SELECT 1 AS `row_exists` FROM myTable WHERE user_id = :id_var";
  $stmt = $conn->prepare($sql);
  $stmt->bindParam(':id_var', $id_var);
  $stmt->execute();
  if($stmt->fetch())  {
      // row found
  } else {
      // row not found 
  }
  $stmt->closeCursor();