簡體   English   中英

檢查記錄是否存在的最干凈方法

[英]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)是否COUNT(1)找到的行數限制為1,或者服務器在找到第一個記錄后仍繼續搜索更多記錄?
  2. if ($stmt->fetch()[0]>0) 這是從SQL查詢中獲取信息並執行“如果有條件的話”的最干凈的方法嗎?

當然,如果有人發現任何可以改善我的代碼的東西,我將很高興收到您的反饋。

問:我的SQL語句結尾是否應該有LIMIT 1? COUNT(1)是否已將找到的行數限制為1,或者服務器在找到第一個記錄后仍繼續搜索更多記錄?

如果執行成功,因為沒有GROUP BY子句,則SELECT COUNT() FROM查詢將返回一行。 無需添加LIMIT 1子句,不會有任何影響。

數據庫將搜索滿足WHERE子句中條件的所有行。 如果user_id列是UNIQUE,並且有一個索引作為前導列,或者,如果該列是表的PRIMARY KEY ...,那么使用索引來搜索所有匹配的行將非常有效。 如果沒有索引,則MySQL將需要搜索表中的所有行。

可以為您帶來良好業績的指標 您可以不同地編寫查詢,以獲得可用的結果。 但是你所擁有的很好。

問:這是最干凈的嗎?

  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(); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM