2012-01-26 61 views
2

我试图找到最有效的方式来确定表格行是否存在。一种有效的方法来测试表格行是否存在

我想到3个选项:

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

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

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

看来,MySQL的第一种方法是更有效的: Best way to test if a row exists in a MySQL table

这是真的,一般用于任何数据库?

更新:

我已经添加了第三个选项。

UPDATE2:

假设数据库产品MySQL和Oracle和SQL服务器。

+0

什么意思是“任何数据库” - 任何数据库产品? – 2012-01-26 22:14:12

+0

是的。任何数据库产品。 – dcernahoschi 2012-01-26 22:18:17

+0

我不认为这是可以回答的 - 每个产品的实现将大大不同*。你必须用你计划使用的每个产品进行测试 – 2012-01-26 22:21:24

回答

4

我会做

SELECT COUNT(1) FROM table 1 WHERE some_condition. 

但我不认为它使一个显著的差异,除非你调用了很多(在这种情况下,我可能会使用不同的策略)。

3

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

+0

这也是我的感觉。但只是一种感觉。 – dcernahoschi 2012-01-26 22:20:57

1

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

但是在Oracle中我见过很多次了另一种方法建议之前:

SELECT COUNT(1) FROM table 1 WHERE some_condition. 
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或0,true或false),那么存在使用方法:

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

Oracle可以停止后计数它受到了重创。

相关问题