2012-01-26 60 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可以停止後計數它受到了重創。

相關問題