我正在PL/pgSQL中編寫一個函數,並且正在尋找最簡單的方法來檢查行是否存在。
現在我正在選擇一個integer
到boolean
,這實際上並不奏效。我對PL/pgSQL沒有足夠的經驗,還沒有足夠的知道這樣做的最佳方式。PL/pgSQL檢查行是否存在
這是我的一部分功能:
DECLARE person_exists boolean;
BEGIN
person_exists := FALSE;
SELECT "person_id" INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists THEN
-- Do something
END IF;
END; $$ LANGUAGE plpgsql;
更新 - 我在做這樣的事情現在:
DECLARE person_exists integer;
BEGIN
person_exists := 0;
SELECT count("person_id") INTO person_exists
FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;
IF person_exists < 1 THEN
-- Do something
END IF;
好點! (雖然person_id可能是主鍵,所以它只會使用索引查找「掃描」單個表)。 – 2012-08-09 22:20:17
@a_horse_with_no_name:截至目前(Postgres 9.1)'count()'* always *會觸發順序掃描。嘗試'用任何表'EXPLAIN ANALYZE SELECT count(id)from tbl'。更多關於[Postgres Wiki中的慢計數](http://wiki.postgresql.org/wiki/Slow_Counting)。 Postgres 9.2的新索引專用掃描應該可以改進,因爲它可以(提供一些條件)利用「count(id)」的索引掃描 - 儘管如此,我還沒有嘗試自己查看。 – 2012-08-09 22:27:08
A帶條件的count(*)* *(特別是不在PK列上)將不會觸發順序掃描。 – 2012-08-09 22:32:14