测试表行是否存在的有效方法

时间:2012-01-26 22:12:17

标签: mysql sql sql-server performance oracle

我正在尝试找到确定表行是否存在的最有效方法。

我想到了3个选项:

  1. SELECT EXISTS(SELECT 1 FROM table1 WHERE some_condition);

  2. SELECT 1 FROM table1 WHERE some_condition LIMIT 0,1;

  3. SELECT COUNT(1)FROM table1 WHERE some_condition;

  4. 对于MySQL来说,第一种方法似乎更有效: Best way to test if a row exists in a MySQL table

    对于任何数据库一般都是如此吗?

    更新:

    我添加了第三个选项。

    UPDATE2:

    我们假设数据库产品是mysql,oracle和sql-server。

5 个答案:

答案 0 :(得分:4)

我愿意

SELECT COUNT(1) FROM table 1 WHERE some_condition.

但是我不认为它会产生重大影响,除非你经常调用它(在这种情况下,我可能会使用不同的策略)。

答案 1 :(得分:4)

如果您的意思是在至少有一行存在某些条件(1或0,真或假)时用作测试,那么:

select count(1) from my_table where ... and rownum < 2;

Oracle可以在受到攻击后停止计数。

答案 2 :(得分:3)

存在更快,因为它将返回与子查询匹配的结果数,而不是整个结果。

答案 3 :(得分:3)

不同的方法有不同的优点和缺点:

SELECT EXISTS(SELECT 1 FROM table1 WHERE some_condition);

可能是MySQL上最快的,但是

SELECT COUNT(1) FROM table 1 WHERE some_condition

在@Luis的回答中给你计数。

更重要的是,我建议你看看你的业务逻辑:很少有必要只看一行是否存在,更多时候你会想要

  • 使用这些行,所以只需选择并处理0行的情况
  • 或者您希望更改这些行,在这种情况下,只需进行更新并检查mysql_affected_rows()
  • 如果您想要插入一行(如果它尚未存在),请查看INSERT .. ON DUPLICATE KEYREPLACE INTO

答案 4 :(得分:1)

exists函数通常在SQL中定义,它不仅仅是一个MySQL函数:http://www.techonthenet.com/sql/exists.php 我通常使用此函数来测试特定行是否存在。

然而在Oracle中,我曾多次看到过其他方法:

SELECT COUNT(1) FROM table 1 WHERE some_condition.