检查行是否存在,最有效的方法?

Axo*_*xon 2 php mysql pdo

SQL 查询 /P1/

  1. SELECT EXISTS(SELECT /p2/ FROM table WHERE id = 1)
  2. SELECT /p2/ FROM table WHERE id = 1 LIMIT 1

SQL 选择 /P2/

  1. COUNT(id)
  2. id

PHP PDO 函数 /P3/

  1. fetchColumn()
  2. rowCount()

从以下 3 部分来看,检查行是否存在以及是否能够检索数据的最佳方法是什么。

可检索:

/询问/ SELECT id FROM table WHERE id = 1 LIMIT 1

/功能/ rowCount()


无法挽回

/询问/ SELECT EXISTS(SELECT COUNT(id) FROM table WHERE id = 1)

/功能/ fetchColumn()

您认为,最好的方法是什么?

O. *_*nes 6

我猜你所说的最好是指在 MySQL 服务器和客户端上消耗最少的资源。

就是这样:

      SELECT COUNT(*) count FROM table WHERE id=1
Run Code Online (Sandbox Code Playgroud)

您将得到一个单行、一列的结果集。如果该列为零,则未找到该行。如果该列是一列,则找到一行。如果列大于一,则找到多行。

出于以下几个原因,这是一个很好的解决方案。

  1. COUNT(*)效率相当高,尤其id是在建立索引的情况下。
  2. 它在您的客户端软件中有一个简单的代码路径,因为它总是只返回一行。您不必担心像无行或多行这样的边缘情况。
  3. SQL 尽可能清楚地说明您要执行的操作。这对下一个人处理您的代码很有帮助。

LIMIT 1如果添加到此查询中,添加将不会执行任何操作。本质上它已经是一个单行结果集。您可以添加它,但这样会让下一个人查看您的代码想知道您想要做什么,并想知道您是否犯了某种错误。

COUNT(*)计算与该语句匹配的所有行WHERECOUNT(id)稍微慢一些,因为它计算所有行,除非它们的id值为空。它必须进行这项检查。因此,人们通常会使用COUNT(*)除非有机会他们想忽略空值。如果您输入COUNT(id)代码,下一个处理该代码的人将不得不花一些时间来弄清楚您通过计数id而不是通过计算是否有什么特殊意义*

您可以使用其中之一;他们给出相同的结果。